2013-04-05 17 views
6

Sono nuovo in box2d e sto provando ad implementarlo in un gioco LibGDX. Quello che voglio fare è rilevare la collisione tra i vari corpi. Quindi, ho creato una classe collisionDetection e implementato ContactListener in esso che mi dà 4 metodi sovrascritti, ad esempio beginContact() e endContact() che devo affrontare. Inoltre sto passando l'oggetto della classe collisionDetection nello world.setcontactListner(collisionDet) con il quale verranno chiamati i metodi sovrascritti della classe collisionDetection quando i corpi della classe mondiale si scontrano tra loro. Ma il problema si verifica quando i corpi si scontrano il metodo beginContact() viene chiamato ogni volta ma il metodo endContact() non viene chiamato ogni volta che i corpi perdono il contatto. Quindi, quali sono i possibili modi in cui possiamo rilevare il endContact() ogni volta.EndContact di ContactListner (Box2d) non chiamato ogni volta in LibGDX

Il codice della classe di collisionDetection è la seguente:

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 


} 

E World Class

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

Grazie

+0

Sei sicuro che i corpi perdono contatto? Utilizzare Box2dDebugRenderer per verificare. –

+0

Sì, stanno perdendo il contatto perché sto spostando un corpo (dinamico) con l'aiuto delle coordinate del TouchPad e quando il corpo attraversa un altro corpo (statico), 'endContact()' non viene chiamato ogni volta. –

+0

Abbastanza giusto. Il motivo per cui ho suggerito di usare il renderer di debug è che disegna i corpi stessi, piuttosto che qualsiasi cosa tu possa disegnare che potrebbe o meno corrispondere ai corpi. Inoltre, c'è qualche ragione per cui stai chiamando setEnabled (true) all'interno dei callback? –

risposta

0

si potrebbero utilizzare setTranform() per spostare l'oggetto .. Box2d non fornisce la funzione di callback quando viene utilizzata la trasformazione dell'insieme

+0

No Sto usando body.setLinearVelocity() per spostarli. –

+1

esegui il debug del tuo codice usando System.out.println ("endcontacr"); in endContact come posso vedere che hai preso la variabile booleana Colliding come statica e potrebbe dare il callback sia del contact iniziale che del contatto finale ma potrebbe essere nello stesso ciclo step di box2d in modo che non lo si possa rilevare. prova a eseguire il debug usando system.out.println –

Problemi correlati