Comment puis-je implémenter une explosion 2D de manière à causer moins de dégâts aux personnages qui se cachent derrière des caisses ou d'autres couvertures? Idéalement, les dommages dépendront de la résistance du couvercle (par exemple, un mur métallique protégera mieux que la caisse en bois). Idéalement, les dommages diminueront également avec la distance.
Je vais utiliser un portage du moteur physique Box2D - Farseer.
Je vous remercie.
physics
box2d
farseer-physics-engine
Tanière
la source
la source
Réponses:
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.
la source
Les dommages diminuant avec la distance devraient être une tâche simple. Lorsque vous créez l'explosion, vous devez connaître les coordonnées du centre de l'explosion. Puisque vous travaillez en 2D, ce ne seront que x et y.
Tout ce que vous avez à faire est de calculer les distances des joueurs à partir des coordonnées du centre de l'explosion à l'aide du théorème de Pythagore, puis de les utiliser par rapport au rayon maximum pour calculer un pourcentage des dégâts totaux.
Par exemple, prenez les coordonnées (x1, y1) comme point central de l'expliosion et (x2, y2) comme coordonnées du joueur. On peut alors calculer les dégâts subis comme suit:
En ce qui concerne les choses, je suis trop fatigué pour penser à la réponse, mais vous chercheriez essentiellement des intersections le long de la ligne allant du centre de l'explosion au joueur.
la source