2012-03-09 18 views
6

मैं अपने पोंग गेम के लिए सरल निरंतर टकराव का पता लगाने की कोशिश कर रहा हूं हालांकि मुझे यकीन नहीं है कि मैं इस अधिकार को लागू या समझ रहा हूं। AFAIR निरंतर टकराव का पता लगाने के लिए तेजी से चलती वस्तुओं के लिए उपयोग किया जाता है जो सामान्य टकराव का पता लगाने वाली किसी अन्य वस्तु से गुजर सकता है।2 डी निरंतर टकराव का पता लगाने

तो मैंने जो कोशिश की वह यह थी कि मेरे पास एकमात्र तेज़ गतिशील वस्तु है जो मुझे एक गेंद है, मुझे केवल गेंद की स्थिति, इसकी गति की गति और उस वस्तु की स्थिति की आवश्यकता होगी, जिसकी तुलना हम कर रहे हैं।

इससे मुझे लगा कि यह सबसे अच्छा होगा कि उदाहरण के लिए यदि गेंद की गति की गति से संकेत मिलता है कि यह बायीं तरफ बढ़ रहा है, तो मैं इसकी बायीं तरफ से दूसरी वस्तु के दाएं-बाध्य से तुलना करूँगा। इससे मैं गति की बायीं तरफ बाएं गति को जोड़कर कदम बढ़ाऊंगा और यह सुनिश्चित करने के लिए तुलना करूँगा कि यह अन्य वस्तुओं की तुलना में अधिक है। इससे पता चलता है कि कोई बाएं दाएं टक्कर नहीं है।

मेरे पास कुछ हद तक काम कर रहा है, लेकिन दुर्भाग्यवश, गेंद थोड़ी देर के लिए सामान्य रूप से उछाल शुरू कर देती है, तो ऐसा लगता है कि जब कुछ भी नहीं होता है तो यह एक पैडल हिट करता है।

मैं थोड़ा खो गया हूं, किसी भी मदद की सराहना की जाएगी!

static bool CheckContinuousCollision(PActor ball, PRect ballRect, PActor other, PRect otherRect) 
{ 
    PVector ballMoveSpeed; 
    int ballXLimit; 
    int ballYLimit; 

    ballMoveSpeed = ball.moveSpeed; 

    // We are moving left 
    if (sgn(ball.moveSpeed.x) < 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i <= ballXLimit; i++) 
     { 

       if (ballRect.Left < otherRect.Right && otherRect.Left < ballRect.Left) 
      { 
       return true; 
      } 

      ballRect.Left -= i; 
     } 
    } 

      //We are moving right 
    if (sgn(ball.moveSpeed.x) > 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i < ballXLimit; i ++) 
     { 

      if (ballRect.Right > otherRect.Left && ballRect.Right < otherRect.Right) 
      { 
       return true; 
      } 

      ballRect.Right += i; 
     } 
    } 
      // we are not moving 
    if (sgn(ball.moveSpeed.x) == 0) 
    { 
     return false; 
    } 
} 

उत्तर

1

आप केवल एक आयाम की टक्कर की जांच कर रहे हैं, यानी आपकी गेंद के एक्स आयाम को आपके अन्य बनाम।

आप जो चाहते हैं वह तुलना करना है कि दो वस्तुएं 2 डी स्पेस में टकराती हैं या नहीं। यह आसानी से प्रत्येक ऑब्जेक्ट को बाउंडिंग आयत समायोजित करके और आयताकार ओवरलैप की जांच करके आसानी से किया जा सकता है। फिर अपने लूप के लिए आप

+0

ओह ठीक है, तो आप अपने बॉल आयताकार को समायोजित कर सकते हैं! मैं इस पर बहुत लंबे समय से काम कर रहा हूं। मैं वाई आयाम की जांच न करने के दुष्प्रभाव को भूल गया। – RedShft

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