2015-06-29 12 views
14

जहां तक ​​मुझे पता है कि भौतिकी निकायों के लिए डिफ़ॉल्ट एक-दूसरे को उछालना है जब तक कि आप एक दूसरे को हिट नहीं करते हैं जब तक कि आप अपनी टकराव बिटमैस्क को बराबर संख्या में सेट न करें।टकराव बिटमैस्क कैसे काम करता है? स्विफ्ट/स्प्राइटकिट

हालांकि, मुझे लगता है कि टक्कर की वजह से यह बहुत आसान होना चाहिए कि टक्कर के कारण मुझे बहुत आसान होना चाहिए।

let RedBallCategory : UInt32 = 0x1 << 1 
    let GreenBallCategory: UInt32 = 0x1 << 2 
    let RedBarCategory : UInt32 = 0x1 << 3 
    let GreenBarCategory : UInt32 = 0x1 << 4 
    let WallCategory : UInt32 = 0x1 << 5 


     greenBall.physicsBody?.categoryBitMask = GreenBallCategory 
     greenBall.physicsBody?.contactTestBitMask = RedBarCategory 
     greenBall.physicsBody?.collisionBitMask = GreenHealthCategory 

redBall.physicsBody?.categoryBitMask = RedBallCategory 
     redBall.physicsBody?.contactTestBitMask = GreenBarCategory 
     redBall.physicsBody?.collisionBitMask = RedHealthCategory 

    let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
    self.physicsBody = borderBody 
    self.physicsBody?.friction = 0 
    borderBody.contactTestBitMask = RedBallCategory | GreenBallCategory 
    borderBody.categoryBitMask = WallCategory 

तो यहां मुझे अपनी 2 गेंदें और मेरा सीमा शरीर मिला है। मैं टक्कर का पता लगाना चाहता हूं जो मैं चाहता हूं, लेकिन जब मैं सीमा शरीर की श्रेणी बिट मास्क जोड़ता हूं, तो यह गेंदों को स्क्रीन के माध्यम से और बाहर जाने की अनुमति देता है, जो मैं नहीं चाहता।

मैं भी गेंदों को एक-दूसरे से उछालना चाहता हूं, लेकिन केवल जब मैं गेंद की श्रेणी में से किसी एक को टिप्पणी करता हूं तो बिटमास्क वे उछालते हैं। अन्यथा वे एक दूसरे के माध्यम से जाते हैं।

यह मुझे बिल्कुल समझ में नहीं आता है क्योंकि इनमें से प्रत्येक आइटम में एक अलग टक्कर है। मैंने कभी-कभी यह भी किया था कि 5 के बराबर सभी संख्याओं को सेट करने से सबकुछ एक-दूसरे से गुज़रने की इजाजत मिल जाएगी, लेकिन फिर इसे 6 तक सेट करने से सबकुछ एक-दूसरे को मारने की इजाजत मिल जाएगी।

टकराव बिटमास्क कैसे काम करते हैं और क्या बहुत सारे क्रिसक्रॉसिंग टकराव नियमों का प्रबंधन करने का कोई उचित तरीका है?

उत्तर

37

आप वांछित व्यवहार नहीं प्राप्त कर सकते क्योंकि आपने श्रेणी, संपर्क और टक्कर बिट मास्क ठीक से सेट नहीं किया है। आप इसे इस तरह सेट काम करने के लिए कर सकते हैं पर एक उदाहरण है:

greenBall.physicsBody?.categoryBitMask = GreenBallCategory //Category is GreenBall 
greenBall.physicsBody?.contactTestBitMask = RedBarCategory | WallCategory //Contact will be detected when GreenBall make a contact with RedBar or a Wall (assuming that redBar's masks are already properly set) 
greenBall.physicsBody?.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory //Collision will occur when GreenBall hits GreenBall, RedBall or hits a Wall 

redBall.physicsBody?.categoryBitMask = RedBallCategory //Category is RedBall 
redBall.physicsBody?.contactTestBitMask = GreenBarCategory | GreenBallCategory | WallCategory //Contact will be detected when RedBall make a contact with GreenBar , GreenBall or a Wall 
redBall.physicsBody?.collisionBitMask = RedBallCategory | GreenBallCategory | WallCategory //Collision will occur when RedBall meets RedBall, GreenBall or hits a Wall 

let borderBody = SKPhysicsBody(edgeLoopFromRect: self.frame) 
self.physicsBody = borderBody 
self.physicsBody?.friction = 0 
borderBody.contactTestBitMask = RedBallCategory | GreenBallCategory //Contact will be detected when red or green ball hit the wall 
borderBody.categoryBitMask = WallCategory 
borderBody.collisionBitMask = RedBallCategory | GreenBallCategory // Collisions between RedBall GreenBall and a Wall will be detected 

मैं categoryBitMask के बारे में किए गए दस्तावेज़ों को पढ़ने के लिए जो एक मुखौटा है कि परिभाषित करता है कौन-सी श्रेणियां भौतिकी शरीर अंतर्गत आता है है आप की सिफारिश करेंगे करने के लिए:

हर एक दृश्य में भौतिकी निकाय को 32 अलग-अलग श्रेणियों तक असाइन किया जा सकता है, प्रत्येक बिट मास्क में थोड़ा सा होता है। आप को अपने गेम में उपयोग किए गए मास्क मानों को परिभाषित करते हैं। टक्कर के साथ संयोजन में बिटमैस्क और संपर्क टेस्टबिटमास्क गुण, आप परिभाषित करते हैं कि भौतिकी निकाय एक दूसरे के साथ बातचीत करते हैं और जब आपके गेम को इन इंटरैक्शन के अधिसूचित किया जाता है।

contactTestBitMask - एक मुखौटा परिभाषित करता है कि जो शरीर की श्रेणियों एक वर्तमान भौतिक विज्ञान शरीर के साथ चौराहे अधिसूचना का कारण है।

दो शरीर एक ही स्थान साझा करते हैं, प्रत्येक शरीर की श्रेणी मुखौटा एक तार्किक और आपरेशन प्रदर्शन से अन्य शरीर के संपर्क मुखौटा के खिलाफ परीक्षण किया है। यदि कोई नॉनजेरो मान में तुलना परिणाम, SKPhysics संपर्क ऑब्जेक्ट बनाया गया है और भौतिकी दुनिया के प्रतिनिधि को पास किया गया है। सर्वश्रेष्ठ प्रदर्शन के लिए, संपर्क में केवल सेट बिट्स मुखौटा संबंधों के लिए आप में रुचि रखते हैं

collisionBitmask -। एक मुखौटा परिभाषित करता है कि जो भौतिकी निकायों की श्रेणियों को इस भौतिक विज्ञान शरीर के साथ टकराने कर सकते हैं।

जब दो भौतिक विज्ञान शरीर एक दूसरे से संपर्क, एक टक्कर हो सकती है। इस शरीर के टक्कर मुखौटा की तुलना अन्य लॉजिकल और ऑपरेशन करके अन्य शरीर की श्रेणी मास्क से की जाती है। यदि परिणाम एक nonzero मान है, तो यह शरीर टकराव से प्रभावित होता है। प्रत्येक शरीर स्वतंत्र रूप से चुनता है कि क्या यह दूसरे शरीर से प्रभावित होना चाहता है। उदाहरण के लिए, आप टकराव की गणना से बचने के लिए इसका उपयोग कर सकते हैं जो शरीर के वेग में नगण्य परिवर्तन कर देगा।

तो बुनियादी तौर पर, इन सभी स्थापित करने के लिए, आप की तरह अपने आप कुछ पूछना चाहिए:

ठीक है, मैं एक हरे रंग की गेंद है, और एक लाल गेंद, और दृश्य पर दीवार वस्तुओं। कौन से निकायों के बीच मैं टकराव करना चाहता हूं, या जब मैं संपर्क पंजीकृत करना चाहता हूं? मैं एक हरे और लाल गेंद को एक दूसरे के साथ टकराने और दीवारों के खिलाफ टकराने के लिए चाहता हूं। एक समस्या नहीं है। मैं पहली बार ऊपर श्रेणियों ठीक से टक्कर बिट मास्क इस तरह सेट हो जाएगा, और फिर मैं सेट हो जाएगा:

greenBall.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory; //greenBall will collide with greenBall, redBall and a wall 
redBall.collisionBitMask = GreenBallCategory | RedBallCategory | WallCategory 

wall.collisionBitMask = GreenBall | RedBall 

अब, मैं पता लगाने के लिए जब कुछ संपर्कों होते हैं (didBeginContact में: विधि) चाहते हैं ... लेकिन मुझे नहीं पता सभी संभावित संपर्कों के बारे में अधिसूचित होना चाहते हैं, बल्कि गेंदों के बीच संपर्कों के बारे में सूचित करने के लिए (गेंदों और दीवारों के बीच संपर्कों को अनदेखा कर दिया जाएगा)। तो contactTestBitMasks सेट कर सकते हैं इस लक्ष्य को हासिल करने के लिए:

greenBall.contactTestBitMask = GreenBallCategory | RedBallCategory; 
redBall.contactTestBitMask = GreenBallCategory | RedBallCategory; 

और बस हो गया। महत्वपूर्ण बात यह है कि जब आप संपर्क पहचान का उपयोग नहीं करते हैं, तो आपको contactTestBitMask सेट नहीं करना चाहिए। यह प्रदर्शन कारणों से है। यदि आपको टकराव का पता लगाने की आवश्यकता नहीं है, और आप केवल संपर्कों का पता लगाने में रूचि रखते हैं, तो आप collisionBitMask = 0 सेट कर सकते हैं।

महत्वपूर्ण:

self.physicsWorld.contactDelegate = self; //where self is a current scene 

आशा है कि यह एक बिट में मदद करता है:

सुनिश्चित करें कि आप आदेश didBeginContact और didEndContact विधियों का उपयोग करने में भौतिकी दुनिया के संपर्क प्रतिनिधि निर्धारित किया है सुनिश्चित करें।

+0

कमाल का जवाब, उस सब को लिखने के लिए समय निकालने के लिए आपको बहुत बहुत धन्यवाद। यह पूरी तरह से काम कर रहा है। "खुद से यह पूछें" भाग निश्चित रूप से उस चीज़ को साफ़ कर देता है जिस पर मैं उलझन में था। आपको बहुत धन्यवाद, बहुत कुछ! – Noowoo

+0

यदि आपके पास 32 से अधिक है तो क्या होगा? – cnzac

+0

@Abcdefg आप didEnd फ़ंक्शन में टक्कर के अंत का पता कैसे लगा सकते हैं? – Marin

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