Wie kann man 2D-Explosionen implementieren, die unter Berücksichtigung von Deckung und Entfernung Schaden verursachen?

9

Wie kann ich eine 2D-Explosion so implementieren, dass Charaktere, die sich hinter Kisten oder anderen Deckungen verstecken, weniger Schaden erleiden? Im Idealfall hängt die Beschädigung von der Stärke der Abdeckung ab (z. B. schützt eine Metallwand besser als eine Holzkiste). Im Idealfall nimmt der Schaden auch mit der Entfernung ab.

Ich werde einen Port der Box2D-Physik-Engine verwenden - Farseer.

Danke.

Den
quelle
1
Wiki ( goo.gl/c1OJx ) empfiehlt die Verwendung von Partikeln, die möglicherweise tatsächlich sinnvoll sind, da sie tatsächliche physikalische Prozesse simulieren. Hat jemand über einen solchen Ansatz nachgedacht?
Den

Antworten:

8

Eine relativ vereinfachte Methode besteht darin, einen Strahl vom Zentrum der Explosion zum Zentrum jeder Entität zu ziehen, in der DISTANCE(explosion,entity) < exlosion.max_radius(Pseudocode).

Folgen Sie für jede Entität diesem Strahl und verringern Sie dabei den Grundschaden. Wenn Sie ein Objekt treffen, subtrahieren Sie dessen Deckungswert vom Schaden (was den Strahl wesentlich verkürzt).

Wenn der Strahl auf die Entität trifft, ist der verbleibende Schaden Ihr Explosionsschaden.

Für diesen Ansatz möchten Sie wahrscheinlich einen ziemlich hohen Grundschaden, der mit der Entfernung schnell abnimmt (umgekehrt proportional zum Quadrat der Entfernung sollte gut funktionieren).


Ein anderer Ansatz besteht darin, einen Sektor zu zeichnen, der das Unternehmen vollständig enthält. aber nicht weiter; und den ganzen Weg raus nach.max_radius . Subtrahieren Sie von der Fläche dieses Sektors die Fläche, die von einer Deckung zwischen der Explosion und dem Unternehmen abgedeckt wird, multipliziert mit seinem Deckungswert. Der verbleibende Bereich ist Ihr Explosionsschaden.

Ein netter Nebeneffekt davon ist, dass je näher das Objekt an der Explosion ist, desto breiter der Sektor wird und desto mehr Schaden Sie erleiden (wenn Sie den gesamten Bereich des Sektors zählen und nur den Deckungsbereich zwischen den Sektoren abziehen Entität und Explosion.

Es könnte auch nützlich sein, die Deckung als Einheiten zu behandeln. und subtrahiere einfach den Schaden, den nähere Wesen von denen weiter draußen erleiden, aber das könnte knorrig werden.


Es gibt zweifellos einen noch eleganteren und klügeren Ansatz, aber er erfordert wahrscheinlich einen ziemlich bösen Kalkül. Das tut es immer.

Williham Totland
quelle
0

Mit der Entfernung abnehmender Schaden sollte eine einfache Aufgabe sein. Wenn Sie die Explosion erstellen, sollten Sie die Koordinaten des Explosionszentrums kennen. Da Sie in 2d arbeiten, sind es nur x und y.

Alles, was Sie tun müssen, ist, die Entfernung (en) des Spielers von den Koordinaten des Explosionszentrums mithilfe des Satzes von Pythagoras zu berechnen und diese dann gegen den maximalen Radius zu verwenden, um einen Prozentsatz des Gesamtschadens zu berechnen.

Nehmen Sie zum Beispiel die Koordinaten (x1, y1) als Mittelpunkt der Explosion und (x2, y2) als Koordinaten des Spielers. Wir können dann den erlittenen Schaden wie folgt berechnen:

Distance from centre = sqrt((x2-x1 + (y2-y1)²)
Damage taken = (Distance from centre/Explosion radius) * max damage 

Was die Dinge im Weg betrifft, bin ich zu müde, um an die Antwort zu denken, aber Sie würden im Grunde nach Kreuzungen entlang der Linie vom Zentrum der Explosion zum Spieler suchen.

Adamk
quelle