Jak wdrożyć eksplozje 2D, które spowodują uszkodzenia, biorąc pod uwagę osłony i odległość?

9

Jak zaimplementować eksplozję 2D w taki sposób, aby powodowała mniejsze obrażenia postaci chowających się za skrzyniami lub inną osłoną? Idealnie uszkodzenie będzie zależeć od wytrzymałości osłony (np. Metalowa ściana będzie lepiej chronić niż drewniana skrzynia). Idealnie obrażenia zmniejszają się również wraz z odległością.

Użyję portu silnika fizyki Box2D - Farseer.

Dziękuję Ci.

Legowisko
źródło
1
Wiki ( goo.gl/c1OJx ) zaleca stosowanie cząstek, które mogą mieć sens, ponieważ w pewnym sensie symulują rzeczywiste procesy fizyczne. Czy ktoś rozważał takie podejście?
Den

Odpowiedzi:

8

Względnie uproszczony sposób polega na narysowaniu promienia od środka wybuchu do środka każdej istoty, gdzie DISTANCE(explosion,entity) < exlosion.max_radius (pseudo-kod).

Dla każdego bytu podążaj za tym promieniem, zmniejszając podstawowe obrażenia w miarę przemieszczania się. Ilekroć uderzasz w przedmiot, odejmuj jego wartość ochrony od obrażeń (zasadniczo skracając promień).

Kiedy promień uderza w istotę, wszelkie obrażenia, które pozostały, to obrażenia od wybuchu.

W tym podejściu prawdopodobnie potrzebujesz dość wysokich obrażeń podstawowych, które szybko zmniejszają się wraz z odległością (odwrotnie proporcjonalne do kwadratu odległości powinno zrobić dobrze).


Innym podejściem jest narysowanie sektora całkowicie zawierającego jednostkę; ale nie szerszy; i aż do .max_radius. Odejmij od obszaru tego sektora obszar objęty dowolną osłoną między eksplozją a bytem, ​​pomnożony przez jego wartość osłonową. Pozostały obszar to obrażenia od wybuchu.

Jednym fajnym efektem ubocznym jest to, że im bliżej eksplozji jest byt, tym szerszy sektor zyskuje i tym więcej otrzymujesz obrażeń (licząc cały obszar sektora i po prostu odejmując obszar osłony między byt i wybuch.

Przydatne może być również traktowanie ochrony ubezpieczeniowej jako podmiotów; i po prostu odejmij obrażenia otrzymane przez bliższe byty od tych znajdujących się dalej, ale mogą one ulec poważnemu uszkodzeniu.


Niewątpliwie istnieje jeszcze bardziej eleganckie i sprytne podejście, ale prawdopodobnie wymaga trochę nieprzyjemnego rachunku różniczkowego. Zawsze tak jest.

Williham Totland
źródło
0

Zmniejszenie obrażeń wraz z odległością powinno być prostym zadaniem. Kiedy tworzysz eksplozję, powinieneś znać współrzędne środka wybuchu. Ponieważ pracujesz w 2d, będzie to tylko xiy.

Wszystko, co musisz zrobić, to obliczyć odległości gracza od współrzędnych środka wybuchu, używając twierdzenia Pitagorasa, a następnie użyć tego w odniesieniu do maksymalnego promienia, aby obliczyć procent całkowitych obrażeń.

Na przykład weź współrzędne (x1, y1) jako punkt środkowy eksplozji, a (x2, y2) jako współrzędne gracza. Następnie możemy obliczyć otrzymane obrażenia w następujący sposób:

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

Co do rzeczy, jestem zbyt zmęczony, aby wymyślić odpowiedź, ale w zasadzie szukałbyś skrzyżowań wzdłuż linii od środka wybuchu do gracza.

Adam
źródło