2013-04-05 6 views
6

Jestem nowy w Box2D i próbuje wdrożyć go w libgdx Game. To, co chcę zrobić, to wykryć kolizję między różnymi ciałami. Tak, zrobiłem wykrywanie kolizji klasy i wdrożenia ContactListener w nim, co dało mi 4 metody przesłonięte tj beginContact() i endContact() którym mam do czynienia. Również jestem przechodzącej przedmiot wykrywanie kolizji klasy w world.setcontactListner(collisionDet) przez który Zastępowana metody klasy wykrywanie kolizji zostanie wywołana, gdy organy w klasie światowej zderzają się ze sobą. Ale problem ma miejsce, gdy organy zderzają beginContact() metoda jest wywoływana za każdym razem, ale endContact() metoda nie jest wywoływana za każdym razem, kiedy organy stracił contact.So, jakie są możliwe sposoby możemy wykrywają endContact() razem.EndContact z ContactListner (box2d) nie jest wywoływana za każdym razem w libgdx

Kod klasy wykrywanie kolizji jest następująca:

public class CollisionDetection implements ContactListener { 
static Fixture fixtureA; 
static Fixture fixtureB; 
public static boolean Colliding=false; 
World world; 


protected CollisionDetection(World world, long addr) { 
    this.world = world; 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void beginContact(Contact contact) { 
    // TODO Auto-generated method stub 
    fixtureA = contact.getFixtureA(); 
    fixtureB = contact.getFixtureB(); 

    Colliding=true; 

} 

@Override 
public void endContact(Contact contact) { 
    // TODO Auto-generated method stub  
    Colliding=false; 

} 

@Override 
public void preSolve(Contact contact, Manifold oldManifold) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void postSolve(Contact contact, ContactImpulse impulse) { 
    // TODO Auto-generated method stub 


} 

A World Class

collisionDet = new CollisionDetection(worldbox, 0);
worldbox.setContactListener(collisionDet);

Dzięki

+0

Czy jesteś pewien, że ciała tracą kontakt? Użyj Box2dDebugRenderer, aby sprawdzić. –

+0

Tak, tracą kontakt bo ruszam jedno ciało (dynamiczny) z pomocą współrzędnych touchpad i gdy organizm przechodzi przez kolejne podmioty (statyczny), 'endContact()' nie jest nazywany spędzaj. –

+0

Wystarczająco fair. Powodem, dla którego zasugerowałem użycie renderera debugowania, jest to, że rysuje on same ciała, a nie cokolwiek, co rysowałeś, co może, ale nie musi pasować do ciał. Czy istnieje jakiś powód, dla którego wywołujesz setEnabled (true) wewnątrz callbacków? –

Odpowiedz

0

Można używać setTranform() do przemieszczania obiektu .. . box2d nie daje oddzwanianie, gdy używamy ustawić przekształcić

+0

Nie Używam body.setLinearVelocity() do ich przenoszenia. –

+1

czy debugowałeś swój kod przy użyciu System.out.println ("endcontacr"); w endContact, ponieważ widzę, że podjąłeś zmienną boolean Colliding as static i może wywoływać callback zarówno rozpoczęcia kontaktu, jak i endcontact, ale może być w tym samym kroku cyklu box2d, więc nie możesz go wykryć. spróbuj debugować przy użyciu system.out.println –

Powiązane problemy