Come posso gestire il rilevamento delle collisioni in modo che gli oggetti veloci non possano passare attraverso i muri?


14

Sto creando uno sparatutto a scorrimento laterale 2D e sto riscontrando qualche problema con il rilevamento delle collisioni per i proiettili. Tutto, inclusi i proiettili, sono oggetti con i propri poligoni / metodi di aggiornamento.

Il problema è che i proiettili vanno veloci e a 60 fotogrammi al secondo (a che cosa serve il gioco) un proiettile salterà spesso attraverso un muro - poiché si sposta più della larghezza del muro durante l'intervallo di aggiornamento - e continua felicemente sulla sua strada poiché i poligoni non si sovrapporranno mai.

Cosa posso fare al riguardo? L'unica cosa che sono stato in grado di inventare è di tracciare una linea dalla vecchia posizione alla nuova posizione e fare il rilevamento delle collisioni su questo, ma il disegno di linea per il rilevamento delle collisioni è sconsigliato dalla documentazione di slick2d. Come posso risolvere questo?


Non una risposta completa, quindi un commento. Non consiglierei mai di disegnare graficamente una linea, ma matematicamente puoi farlo, è solo una semplice intersezione raggio-piano per vedere se si è verificata la collisione. È quindi possibile eseguire un rilevamento a passi fissi più piccoli per ottenere il momento esatto (e tutte le informazioni che ne derivano) quando si è verificata la collisione senza dover correre a un ritmo costantemente più elevato, come suggerito nelle risposte. Fai un controllo meno costoso e poi passa il tempo a ottenere la risposta più precisa di cui hai bisogno.
James,

Risposte:


9

Gli approcci standard sono (scegline uno):

  1. Aumenta la tua larghezza del contorno E / O riduci la velocità massima del tuo proiettile in modo che non possa mai saltare attraverso un muro in un singolo aggiornamento (richiede un po 'di Pitagora per capire le distanze massime / larghezza minima del confine);
  2. Eseguire il rilevamento continuo delle collisioni (CCD), di solito mediante raycasting per rilevare la collisione con superfici lineari (2) o planari (3D) davanti all'oggetto in movimento. Questo è più costoso, ma è una soluzione più completa. Il raycasting contro le linee 2D è piuttosto semplice, ma in questo caso è necessario definire tutti i confini come poligoni rettilinei.

In ogni caso, puoi modellare i tuoi proiettili come raggi, se questo si adatta all'aspetto del tuo gioco, come in left4kdead . In questo modo non è necessario approssimare i proiettili come raggi, perché sono già raggi. Dal punto di vista degli sguardi, questo può sembrare decente se si disegna la linea con un punto più luminoso sull'estremità del proiettile o si disegna semplicemente la linea come un gradiente dalla luce (estremità del proiettile) all'oscurità (estremità della coda), dandogli un aspetto di movimento.

Concordo sul fatto che, nella maggior parte dei casi, l'uso della grafica per il rilevamento delle collisioni è un po 'fuorviante, tuttavia il rilevamento delle collisioni perfetto per i pixel è esattamente questo ed è una tecnica accettata. Immagino che tutto dipenda da cosa vuoi ottenere e da quanto velocemente. Se non hai bisogno di un gioco molto veloce con molti corpi + azione, provaci. Altrimenti è meglio usare uno degli approcci che ho descritto sopra.


Grazie per l'ottima risposta - idealmente mi piacerebbe che fosse veloce con molti corpi in movimento. Il motivo per cui sto trattando i proiettili come oggetti fisici è che sono influenzati dalla gravità come tutto il resto (quindi piegati leggermente verso il basso, a seconda della velocità del proiettile, ecc.). Non è un buon modo per farlo? Questo è il mio primo gioco, quindi sto ancora cercando le migliori pratiche. Potrei anche usare un'equazione parabolica, ma non sono sicuro di come impostare i coefficienti relativi all'angolo di velocità / mira del proiettile
Mala,

3
Sembra troppo dettaglio per i proiettili. Nella vita reale, quando si spara un proiettile, è improbabile che tu riesca a trovare quella lumaca a causa della forza del rimbalzo, dell'imprevedibilità dell'angolo del richochet, ecc. Oppure, entra semplicemente in un corpo e rimane lì (albero, persona). Vorrei solo che sparissero o rimbalzassero e poi svanissero poco dopo. Concentrati sul tuo gameplay principale, non preoccuparti troppo di questi piccoli dettagli. Il realismo si concentra meglio sulle cose che contano.
Ingegnere,

Sì, suppongo di poter usare solo linee rette per i proiettili e forse trovare un modo per farli curvare leggermente verso il basso più tardi, se sembra importante.
Mala,

2
Se la velocità dei proiettili non è troppo alta (cioè non così veloce da non riuscire a vederli viaggiare attraverso lo schermo), allora puoi semplicemente applicare la gravità alla loro velocità mentre modellazione del loro rilevamento delle collisioni usando semplici raggi. L'utente non noterà più che il proiettile si sta muovendo come una serie di linee rette più di quanto noterà come anche tutti gli altri oggetti facciano lo stesso. Per le scie di proiettile, calcolare e tracciare una scia curva (spline) non è difficile e aumenterà l'illusione di una curva regolare sulla traiettoria del proiettile.
Sean Middleditch,

3

Se vuoi che i tuoi proiettili si comportino come oggetti fisici realistici (ad es. I tuoi proiettili sono più come frecce o pietre di una catapulta piuttosto che un fuoco di pistola), puoi anche provare ad aumentare la frequenza dei tuoi aggiornamenti di fisica.

Quindi, mentre il gioco potrebbe essere eseguito con 60 frame al secondo, la simulazione fisica potrebbe essere eseguita a 120 aggiornamenti al secondo (ecco l'onnipresente correzione dell'articolo timestep che spiega una buona configurazione fisica che può funzionare a velocità diversa rispetto al rendering-loop).

Naturalmente, aumentando l'intervallo di aggiornamento sul motore fisico si caricherà maggiormente la CPU. Quindi questo approccio è sensato solo se i tuoi proiettili non si muovono molto velocemente (cosa che stavo assumendo poiché sei in grado di dire che i tuoi proiettili si stanno muovendo ad arco).


Grazie! Lo sto effettivamente facendo (oltre ad usare proiettili a forma di linea) e spero che rimanga fattibile man mano che il gioco diventa più complicato
Mala,
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.