2016-07-10 16 views
1

ich ein 2D OpenGL Spiel, die ich in aabb Kollisionserkennung zu implementieren versuchen Hier ist die Kollisionserkennung Code.OpenGL 2D Kollisionserkennung nicht funktioniert

boolean collisionX = position.x + size.x + dx >= collision.position.x && collision.position.x + collision.size.x >= position.x + dx; 
boolean collisionY = position.y + size.y + dy >= collision.position.y && collision.position.y + collision.size.y >= position.y + dy; 
return collisionX && collisionY; 

Für die Größe, die ich diese Berechnung verwenden , weil einige dieser Sprites aus Texturatlanten stammen.

size.x = pixelWidth * scaleX/modelTexture.spriteWidth, 
size.y = pixelHeight * scaleY/modelTexture.spriteWidth 

I verwenden modelTexture.spriteWidth für beide, da die Höhe und die Breite des Texturatlas des gleiche ist, weil es ein 2^x Quadrat ist.

PixelWidth und PixelHeight sind die Pixelgröße des Bildes auf der Textur, von mir gezählt.

Ich denke, das Problem könnte wegen dieser Berechnungen sein, wenn sie falsch sind. Lass es mich wissen, bitte.

Die Kollisionserkennung scheint jedoch an den falschen Stellen zu geschehen, als ob die Bounding Box jedes Sprites in der Mitte beginnt und sich nach rechts oben erstreckt. Ich habe versucht, dies mit einem Verschiebungsvektor zu erklären, der gleich -size/2f ist. Aber leider hat sich daran nichts geändert.

enter image description here

Denken Sie, das Problem der Ursprung der Sprites/Objekte sein könnten:

Hier ist ein Beispiel für eine Kollision, die nicht korrekt alligned scheint zu sein? Was ist im Mittelpunkt? Wenn ja, wie würde ich den Ursprung nach oben links setzen?

+0

Versuchen Sie eine der Standardmethoden, z.B. 'boolean schneidet = neues Rechteck (x1, y1, width1, height1) .intersects (neues Rectangle (x2, y2, width2, height2));' from 'java.awt' und sehen, wie das geht –

+0

Wenn Sie das skalieren müssen Größen, müssen Sie wahrscheinlich die Positionen entsprechend skalieren? –

+0

'Position.x + Größe.x + dx> = Kollision.Position.x && Kollision.Position.x + Kollision.Größe.x> = Position.x + dx;' sollte es nicht ein '||' hier sein ? (Same of y) Nur eine Intuition den Code zu lesen, habe ich nicht die Mathematik – Zouch

Antwort

0

Ich denke, Sie gerade Kollision gegen eine Seite validieren. Zur Validierung Kollisionen müssen Sie somethint wie das tun:

collisionX = (right_side_Obj1 > left_side_Obj2 && left_side_Obj1 < left_side_Obj2) 
|| (left_side_Obj1 < right_side_Obj2 && right_side_Obj1 > right_side_Obj2); 

In Ihrem Fall denke ich, sollte es sein:

boolean collisionX = (position.x + size.x + dx >= collision.position.x 
      && position.x <= collision.position.x) 
     || (position.x - dx <= collision.position.x + collision.size.x 
      && position.x + + size.x >= collision.position.x + collision.size.x); 
+0

Ich habe die Methode zu dem geändert, was Sie gepostet haben, aber es hat nicht geholfen, die Kollisionen funktionieren immer noch nicht. Und die Kisten scheinen mehr vermasselt zu sein, es ist schwer zu sagen. Irgendwelche anderen Ideen? –

+0

Zwei Vergleiche in jeder Koordinatenrichtung reichen aus, um die Rechtecküberlappung zu überprüfen. Ich finde es leichter, über die Bedingungen nachzudenken, wo sie sich nicht überschneiden, was der Fall ist, wenn die linke der einen größer ist als die rechte der anderen. Dies gibt zwei Bedingungen. Dann negieren Sie den Ausdruck logisch und geben die beiden Bedingungen für die Überprüfung der Überlappung an. –