2013-06-26 7 views
7

आप कैसे जांच सकते हैं कि 2 निकायों (दोनों स्थिरता के साथ) टक्कर (ओवरलैप)?किसी भी पल में दो Box2d निकायों टकराव/ओवरलैप की जांच कैसे करें?

मुझे संपर्क लिस्टनर के बारे में पता है जो एक विधि को आग लगती है जब वे टकराव शुरू करते हैं और जब वे रुकते हैं। लेकिन क्या किसी भी पल में इसे जांचने का कोई तरीका है? पसंद:

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

अतिरिक्त विवरण, उनमें से एक सेंसर है। यह libgdx में है।

+0

संबंधित: https://stackoverflow.com/questions/11062252/how-to-detect-collision-but-do-not-collide-in-box2d पूरी तरह से एक और शरीर के अंदर: https://gamedev.stackexchange.com/questions/27320/in-box2d-how-can-i-check-for-bodies-within-a-circle –

उत्तर

5

आप की तरह

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

beginContact() विधि अपनी दुनिया वस्तु के लिए आवेदन कर सकते हैं setContactlistner हमेशा फोन करेगा जब भी कोई शरीर किसी अन्य शरीर को ओवरलैप या स्पर्श करेगा। आप contact ऑब्जेक्ट जैसे contact.getFixtureA().getBody().getUserData(); पर शरीर के बारे में जानकारी भी प्राप्त कर सकते हैं यदि आप उनके साथ कुछ करना चाहते हैं। और जब वे एक-दूसरे से अलग होते हैं EndContact() विधि कहा जाएगा।

आशा है कि इससे मदद मिलती है।

+1

आप मेरे प्रश्न को समझ/पढ़ नहीं पाए, मुझे संपर्क लिस्टनर के बारे में पता है। – Lestat

+0

जैसा कि मैंने कहा था कि आप उन निकायों के उपयोगकर्ता डेटा प्राप्त कर सकते हैं जो टकराव कर रहे हैं, इसलिए दोनों निकायों के उस उपयोगकर्ता डेटा की मदद से आप एक बूलियन या कुछ ले सकते हैं और इसे प्रस्तुत करने में जांच सकते हैं यदि वह बूलियन सत्य है तो क्या करें काम.और अंत में झूठी संपर्क() विधि। –

+0

मुझे नहीं पता कि यह वर्तमान में एक बग है लेकिन अंत में संपर्क हमेशा आग नहीं होता है। –

2

बस जाँच संपर्क के लिए देख रहे हैं संपर्क सूची में है अगर:

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

     break; 
    } 
} 
+1

संपर्क को छूने पर चेक न भूलें: ce-> संपर्क -> IsTouching()। एएबीबी ओवरलैप होने पर संपर्क बनाते हैं। – Pavel

+1

हालांकि मैंने libgdx लेबल किया था, मैं बताना भूल गया था। यह libgdx में है और कोई भी कॉन्टैक्टलिस्ट नहीं है और न ही शरीर में अन्य विधि u.u – Lestat

+1

खराब के रूप में, लेकिन कामकाजी समाधान दुनिया :: getContactList का उपयोग कर सकता है ... – Pavel

-1

आप चर टकराव बना सकते हैं: जब 0 के बराबर होता है, तो टक्कर झूठी होती है; जब 1 बराबर होता है, टकराव सत्य के बराबर होता है;

तो:

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

आपने इस प्रश्न को भी समझ नहीं लिया – Lestat

संबंधित मुद्दे