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.
Antworten:
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.
quelle
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:
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.
quelle