2013-06-26 8 views
7

Come si può verificare se 2 corpi (con 1 dispositivo entrambi) si scontrano (si sovrappongono)?Come verificare se due corpi Box2d si scontrano/si sovrappongono in qualsiasi momento?

Conosco il ContactListener che attiva un metodo quando iniziano a scontrarsi e quando si fermano. Ma c'è un modo per controllarlo in un dato momento? Ad esempio:

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

Ulteriori dettagli, uno di questi è il sensore. questo è in libgdx.

+0

correlato: https://stackoverflow.com/questions/11062252/how-to-detect-collision-but-do-not-collide-in-box2d completamente all'interno di un altro corpo: https://gamedev.stackexchange.com/questions/27320/in-box2d-how-can-i-check-for-bodies-within-a-circle –

risposta

5

È possibile applicare setContactlistner al vostro oggetto mondo come

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

Il metodo beginContact() sarà sempre chiamare ogni volta che qualsiasi il corpo si sovrapporrà o toccherà un altro corpo. Puoi anche ottenere le informazioni sul corpo tramite l'oggetto contact come contact.getFixtureA().getBody().getUserData(); se vuoi fare qualcosa con loro.E quando si separano l'un l'altro 01 Verrà chiamato il metodo.

Spero che questo aiuti.

+1

Non hai capito/letto la mia domanda, so di ContactListener. – Lestat

+0

Come ho detto puoi ottenere i dati utente dei corpi in collisione, quindi con l'aiuto di quei dati utente di entrambi i corpi puoi prendere un booleano o qualcosa del genere e controllarlo nel rendering se quel booleano è vero, quindi fai il tuo lavoro.E falso nel metodo endContact(). –

+0

Non so se questo è un bug corrente ma endContact non sempre attiva. –

2

Basta controllare se il contatto che si sta cercando è nella lista dei contatti:

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

     break; 
    } 
} 
+1

Non dimenticare, se il contatto sta toccando: ce-> contatto -> IsTouching(). Contatti che creano quando AABB si sovrappongono. – Pavel

+1

Anche se ho etichettato libgdx, ho dimenticato di dirlo. È in libgdx e non esiste getContactList né altro metodo nel corpo u – Lestat

+1

Come soluzione errata, ma funzionante potrebbe utilizzare World :: getContactList ... – Pavel

-1

È possibile creare la collisione variabile: Quando è uguale a 0, la collisione è uguale a false; Quando è uguale a 1, la collisione è uguale a true;

Quindi:

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

non hai nemmeno capito la domanda – Lestat