2013-06-26 8 views
7

Wie können Sie überprüfen, ob 2 Körper (mit 1 Fixture) kollidieren (Überlappungen)?Wie kann man prüfen, ob sich zwei Box2d Körper zu irgendeinem Zeitpunkt überschneiden/überlappen?

Ich weiß über den ContactListener, der eine Methode auslöst, wenn sie anfangen zu kollidieren und wenn sie aufhören. Aber gibt es eine Möglichkeit, es in einem bestimmten Moment zu überprüfen? Wie:

if(body1.overlaps(body2))... 

Zusätzliche Details, einer von ihnen ist Sensor. Das ist in libgdx.

+0

verwandten: https://stackoverflow.com/questions/11062252/how-to-detect-collision-but-do-not-collide-in-box2d vollständig in einem anderen Körper: https://gamedev.stackexchange.com/questions/27320/in-box2d-how-can-i-check-for-bodies-within-a-circle –

Antwort

5

Sie setContactlistner zu Ihrer Welt Objekt wie

world.setContactListener(new ContactListener() { 

      @Override 
     public void beginContact(Contact contact) { 

     if(contact.getfixtureA.getBody().getUserData()=="body1"&& 
       contact.getfixtureB.getBody().getUserData()=="body2") 
      Colliding = true; 
      System.out.println("Contact detected"); 
     } 

     @Override 
     public void endContact(Contact contact) { 
      Colliding = false; 
      System.out.println("Contact removed"); 
     } 

     @Override 
     public void postSolve(Contact arg0, ContactImpulse arg1) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void preSolve(Contact arg0, Manifold arg1) { 
      // TODO Auto-generated method stub 
     } 
    }); 

Die beginContact() Methode aufrufen wird immer dann, wenn jeder anwenden kann Körper wird sich überlappen oder einen anderen Körper berühren. Sie können auch die Informationen über den Körper von contact Objekt wie contact.getFixtureA().getBody().getUserData(); erhalten, wenn Sie etwas mit ihnen tun wollen.Und wenn sie voneinander trennen EndContact() Methode wird aufgerufen.

Hoffnung Das hilft.

+1

Sie nicht verstanden/meine Frage zu lesen, ich weiß über den ContactListener. – Lestat

+0

Wie gesagt, Sie können die Userdata der Körper, die kollidieren, erhalten, also mit Hilfe dieser Benutzerdaten der beiden Körper können Sie einen Boolean oder etwas und überprüfen Sie es im Render, wenn dieser Boolean ist wahr dann tun Sie work.And false es in der endContact() -Methode. –

+0

Ich weiß nicht, ob das ein Fehler ist, aber endContact wird nicht immer ausgelöst. –

2

einfach überprüfen, ob der Kontakt Sie suchen, ist in der Kontaktliste:

for (ContactEdge ce = body1.getContactList(); ce != null; ce = ce.next) 
{ 
    if (ce.other == body2 && ce.contact.isTouching()) 
    { 
     // Do what you want here 

     break; 
    } 
} 
+1

Vergessen Sie nicht zu prüfen, ob der Kontakt berührt: ce-> Kontakt -> IsTouching(). Kontakte, die erstellt werden, wenn AABB überlappen. – Pavel

+1

Obwohl ich libgdx beschrifte, habe ich vergessen zu erzählen. Es ist in libgdx und es gibt keine getContactList noch andere Methode in Körper u.u – Lestat

+1

Als eine schlechte, aber funktionierende Lösung möglicherweise World :: getContactList ... – Pavel

-1

Sie können die Variable Kollision erstellen: Wenn gleich 0 ist, ist Kollision gleich falsch; Wenn gleich 1 ist, ist Kollision gleich wahr; So

:

if(body1.overlaps(body2)==true) 
{collision=1} 
else 
{collision=0} 
+0

hast du die Frage nicht einmal verstanden – Lestat

Verwandte Themen