Une façon relativement simpliste de le faire est de dessiner un rayon du centre de l'explosion au centre de chaque entité où DISTANCE(explosion,entity) < exlosion.max_radius
(pseudo-code).
Pour chaque entité, suivez ce rayon, diminuant les dégâts de base au fur et à mesure. Chaque fois que vous touchez un objet, soustrayez sa valeur de couverture des dégâts (essentiellement en raccourcissant le rayon).
Lorsque le rayon frappe l'entité, les dommages qui restent sont vos dégâts d'explosion.
Pour cette approche, vous voulez probablement un dommage de base assez élevé qui diminue rapidement avec la distance (inversement proportionnel au carré de la distance devrait bien faire).
Une autre approche consiste à dessiner un secteur contenant entièrement l'entité; mais pas plus large; et tout le chemin vers .max_radius
. Soustrayez de la zone de ce secteur la zone couverte par toute couverture entre l'explosion et l'entité, multipliée par sa valeur de couverture. La zone restante est vos dégâts d'explosion.
Un effet secondaire intéressant de cela est que plus l'entité est proche de l'explosion, plus le secteur s'élargit et plus vous subissez de dégâts (en comptant toute la zone du secteur et en soustrayant simplement la zone de couverture entre le entité et explosion.
Il pourrait également être utile de traiter la couverture comme des entités; et simplement soustraire les dégâts subis par des entités plus proches de ceux plus éloignés, mais cela pourrait devenir noueux.
Il existe sans aucun doute une approche encore plus élégante et intelligente, mais elle nécessite probablement un calcul assez méchant. C'est toujours le cas.