2013-05-09 12 views
10

Allgemeinen Kollisionen in Leinwand-Spiele wie ich etwas zu erkennen:Wie Kollisionen zwischen sich schnell bewegenden Objekten erfassen

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; 
} 

Aber das erkennt nur Kollisionen, wenn die Objekte zu der Zeit wird der Rahmen verarbeitet werden, zu berühren. Wenn ich ein Sprite habe, dessen Geschwindigkeit (in Pixeln/Rahmen) größer ist als die Breite eines Hindernisses auf seinem Weg, wird es durch das Hindernis gehen, ohne dass die Kollision erkannt wird.

Wie würde ich prüfen, was zwischen dem Sprite und seinem Ziel liegt?

+1

Prüfen Sie in jedem Frame, ob ein Vektor die Länge Ihrer Sprite-Geschwindigkeit mit dem Objekt schneidet. –

+2

Sie könnten in Betracht ziehen, dies auf [GameDev.SE] zu fragen. – zzzzBov

+0

Auch verwandt: http://stackoverflow.com/questions/7364884/problem-mit-kollision-detektion-von-fast-moving-ball-mit-racket-controlled – JayC

Antwort

2

Das ist im Allgemeinen ein schwieriges Problem und für eine qualitativ hochwertige Lösung wird etwas wie Box 2D-Bibliothek nützlich sein.

Eine schnelle und schmutzige Lösung (die bei diagonal bewegten Objekten falsche positive Ergebnisse liefert) - Kollision zwischen Begrenzungsrahmen überprüfen, die die Position des Objekts im aktuellen und vorherigen Rahmen abdecken.

Statt a.xmin(a.x, a.x - a.velocity_x) Verwendung anstelle von a.x + a.width Verwendung max(a.x + a.width, a.x + a.width - a.velocity_x) usw.

Wenn das Objekt, das schnell bewegt ist klein (eine Kugel), dann Test Kollision zwischen der Leitung (von seinem Ursprung zu Ursprung + Geschwindigkeit) und Kisten mit anderen Objekten.

0

Sie sollten den gesamten Bereich (im Aktualisierungsintervall) vom bewegten Objekt als Begrenzungsbox verwenden, um das Hindernis zu überprüfen.

Verwandte Themen