आप वांछित व्यवहार नहीं प्राप्त कर सकते क्योंकि आपने श्रेणी, संपर्क और टक्कर बिट मास्क ठीक से सेट नहीं किया है। आप इसे इस तरह सेट काम करने के लिए कर सकते हैं पर एक उदाहरण है:
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
विधियों का उपयोग करने में भौतिकी दुनिया के संपर्क प्रतिनिधि निर्धारित किया है सुनिश्चित करें।
कमाल का जवाब, उस सब को लिखने के लिए समय निकालने के लिए आपको बहुत बहुत धन्यवाद। यह पूरी तरह से काम कर रहा है। "खुद से यह पूछें" भाग निश्चित रूप से उस चीज़ को साफ़ कर देता है जिस पर मैं उलझन में था। आपको बहुत धन्यवाद, बहुत कुछ! – Noowoo
यदि आपके पास 32 से अधिक है तो क्या होगा? – cnzac
@Abcdefg आप didEnd फ़ंक्शन में टक्कर के अंत का पता कैसे लगा सकते हैं? – Marin