2013-05-09 13 views
10

generale per rilevare le collisioni nei giochi di tela io uso qualcosa di simile:Come rilevare le collisioni tra oggetti in rapido movimento

function collides(a, b) { 
    return a.x < b.x + b.width && 
    a.x + a.width > b.x && 
    a.y < b.y + b.height && 
    a.y + a.height > b.y; 
} 

Ma questo rileva solo collisioni se gli oggetti si toccano al momento il telaio viene elaborato. Se ho uno sprite la cui velocità (in pixel/frame) è maggiore della larghezza di un ostacolo sul suo percorso, passerà attraverso l'ostacolo senza che la collisione venga rilevata.

Come dovrei controllare cosa c'è tra lo sprite e la sua destinazione?

+1

Su ciascun frame, verificare se un vettore la lunghezza della velocità dello sprite si interseca con l'oggetto. –

+2

Si potrebbe voler considerare di chiedere questo su [GameDev.SE]. – zzzzBov

+0

Relativo anche: http://stackoverflow.com/questions/7364884/problem-with-collision-detection-of-a-fast-moving-ball-with-a-racket-controlled – JayC

risposta

2

Questo è generalmente un problema difficile e per una soluzione di alta qualità qualcosa di simile alla libreria Box 2D sarà utile.

Una soluzione rapida e sporca (che fornisce falsi positivi sugli oggetti in movimento diagonale): controllare la collisione tra i riquadri di delimitazione che coprono la posizione dell'oggetto nella corrente e il precedente frame.

Invece di a.x uso min(a.x, a.x - a.velocity_x), invece di a.x + a.width uso max(a.x + a.width, a.x + a.width - a.velocity_x), ecc

Se l'oggetto che si muove velocemente è piccolo (un proiettile), poi prova di collisione tra linea (dall'origine alla origine + velocità) e scatole di altri oggetti.

0

È necessario utilizzare l'intera area spostata (nell'intervallo di aggiornamento) dall'oggetto in movimento come riquadro di delimitazione per verificare l'ostacolo.

Problemi correlati