Come implementare esplosioni 2D che causeranno danni tenendo conto delle coperture e della distanza?


9

Come posso implementare un'esplosione 2D in modo da causare meno danni ai personaggi che si nascondono dietro casse o altre coperture? Idealmente il danno dipenderà dalla resistenza del coperchio (ad es. La parete metallica proteggerà meglio della cassa di legno). Idealmente il danno diminuirà anche con la distanza.

Userò una porta del motore fisico Box2D - Farseer.

Grazie.


1
Wiki ( goo.gl/c1OJx ) raccomanda di usare particelle che potrebbero avere un senso dal momento che simula in qualche modo i processi fisici reali. Qualcuno ha preso in considerazione un simile approccio?
Den

Risposte:


8

Un modo relativamente semplicistico di fare questo è di disegnare un raggio dal centro dell'esplosione al centro di ogni entità in cui DISTANCE(explosion,entity) < exlosion.max_radius(pseudo-codice).

Per ogni entità, segui questo raggio, diminuendo il danno base mentre procedi. Ogni volta che si colpisce un oggetto sottrarre il suo valore di copertura dal danno (essenzialmente accorciando il raggio).

Quando il raggio colpisce l'entità, qualunque danno rimanga è il danno da esplosione.

Per questo approccio, probabilmente vuoi un danno base piuttosto alto che diminuisca rapidamente con la distanza (inversamente proporzionale al quadrato della distanza dovrebbe fare bene).


Un altro approccio è quello di disegnare un settore che contenga pienamente l'entità; ma non più ampio; e fino in fondo .max_radius. Sottrai dall'area di questo settore l'area coperta da qualsiasi copertura tra l'esplosione e l'entità, moltiplicata per il suo valore di copertura. L'area rimanente è il danno da esplosione.

Un chiaro effetto collaterale di ciò è che più l'entità è vicina all'esplosione, più ampio è il settore e maggiore è il danno che subisci (mentre conti tutta l'area del settore e sottrae l'area di copertura tra il entità ed esplosione.

Potrebbe anche essere utile trattare la copertura come entità; e sottrarre semplicemente i danni subiti da entità più vicine da quelle più lontane, ma ciò potrebbe diventare nodoso.


Esiste indubbiamente un approccio ancora più elegante e intelligente, ma probabilmente richiede qualche calcolo piuttosto brutto. Lo fa sempre.


0

La riduzione dei danni con la distanza dovrebbe essere un compito semplice. Quando crei l'esplosione, dovresti conoscere le coordinate del centro dell'esplosione. Dato che stai lavorando in 2d, sarà solo xey.

Tutto quello che devi fare è calcolare le distanze dei giocatori dalle coordinate del centro dell'esplosione usando il teorema di Pitagora, quindi usalo contro il raggio massimo per calcolare una percentuale del danno totale.

Ad esempio, prendi le coordinate (x1, y1) come punto centrale dell'esplosione e (x2, y2) come coordinate del giocatore. Possiamo quindi calcolare il danno subito come segue:

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

Per quanto riguarda le cose, sono troppo stanco per pensare alla risposta, ma fondamentalmente stai cercando intersezioni lungo la linea dal centro dell'esplosione al giocatore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.