मैं पहली बार बॉक्स 2 डी का उपयोग मध्यम आकार के फ़्लैश गेम में गंभीरता से कर रहा हूं जिस पर मैं काम कर रहा हूं। Box2D के साथ मेरा वर्तमान अनुभव दुनिया, निकायों को बनाने और उन निकायों को एक कार्यात्मक तरीके से दुनिया में जोड़ने के लिए सीमित है।मैं अपने सभी बॉक्स 2 डी टकरावों को एक स्वच्छ, प्रबंधनीय ढंग से कैसे ट्रैक कर सकता हूं?
मुझे अपने गेम पर्यावरण में Box2D को एकीकृत करने के लिए काफी आसान लग रहा है, अच्छी तरह से लिखित कोड बनाए रखा है और ट्यूटोरियल से निपटने के माध्यम से चलने वाले कुछ ट्यूटोरियल पूरे किए हैं। अब जिस मुद्दे का सामना कर रहा हूं वह यह है कि मेरे खेल में कई निकायों होंगे, प्रत्येक अलग-अलग तरीकों से अन्य निकायों के साथ बातचीत कर रहा है, और मुझे अपने b2ContactListener
सबक्लास को बेहद गन्दा होने के बिना लिखना मुश्किल लगता है।
मैंने उपयोग किए गए एक ट्यूटोरियल के आधार पर, मैंने b2ContactListener
का अपना उप-वर्ग बनाया है और BeginContact()
विधि का ओवरराइड जोड़ा है। तर्क यह है कि BeginContact()
प्राप्त होने पर प्राप्त होता है b2Contact
का एक उदाहरण संदर्भित करेगा, जिसके माध्यम से मैं दो b2Fixture
उदाहरणों (दो उदाहरणों को टकराया गया) तक पहुंच सकता हूं। मैं फिर उन b2Fixture
एस के साथ जुड़े b2Body
उदाहरण तक पहुंचने में सक्षम हूं।
समस्या: वर्तमान में मैं (यानी कि क्या वे एक दीवार और एक मिसाइल, या खिलाड़ी और एक पेड़, आदि कर रहे हैं) क्या दो बातें टकरा जानने जो
GetUserData()
और दिखता है का उपयोग करता है की एक राउंडअबाउट रास्ता है एक उदाहरण के रूप में इस तरह:var f1Player:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Player var f2Player:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Player var f1Tree:Boolean = contact.GetFixtureA().GetBody().GetUserData() is Tree var f2Tree:Boolean = contact.GetFixtureB().GetBody().GetUserData() is Tree // ... continutes with all possible combinations. // Example of managing a collision: if(f1Player && f2Tree) { // Player (FixtureA) and Tree (FixtureB) } if(f2Player && f1Tree) { // Player (FixtureB) and Tree (FixtureA) }
आप देख सकते हैं, इस बेहद लंबी और अनियंत्रित अंत जा रहा है। मुझे फ़िक्स्चर ए या फ़िक्स्चर बी के एक निश्चित तत्व को पूरा करने के लिए दो बार प्रदर्शन करने के लिए क्रियाओं के प्रत्येक सेट को भी लिखना होगा, या इसके विपरीत (स्पष्ट रूप से पैरामीटर कॉल के रूप में स्पष्ट रूप से फिर से लिखे गए पैरामीटर के साथ फ़ंक्शन कॉल के रूप में)।
यह स्पष्ट रूप से सही दृष्टिकोण नहीं है, लेकिन मैं संसाधनों का पता लगाने में सक्षम नहीं हूं जो टक्कर पहचान प्रबंधन को और अधिक अच्छी तरह से समझाते हैं।
क्या किसी को भी Box2D का उपयोग करके टक्कर पहचान प्रबंधन के साथ अनुभव है कि वे साझा कर सकते हैं? साथ ही, SetUserData(entityThatOwnsTheBody);
का उपयोग उस विधि का उपयोग करने का सही तरीका है?
लगता है कि लंबे 'अगर' कथन की तरह ही बीइंग क्लास में स्थानांतरित हो जाता है। प्रसंस्करण के लिए कैसे केवल टकराव के लिए एक बार किया जाना चाहिए, उदाहरण के लिए। एक आवाज बजाना या स्कोर में वृद्धि करना। – iforce2d
@ iforce2d यही सच है, मेरा मतलब है वहाँ होना करने के लिए जा रहा है '()' बयान किसी भी तरह से प्रत्येक टक्कर संयोजन के लिए मानदंड जोड़ने के लिए है, लेकिन यह एक फ़ाइल में सब कुछ होने की तुलना में अधिक संगठित लगता है। यह मुझे प्रासंगिक वर्गों के माध्यम से दो चीजों के बीच टकराव आसानी से ढूंढने की क्षमता प्रदान करता है और मुझे यह जांचना नहीं है कि प्रत्येक टक्कर के लिए कौन सा होना है। – Marty
एकल अवसरों के लिए, जिसे व्यक्ति द्वारा प्रबंधित किया जा सकता है, साथ ही सरल 'हैबिन टच किए गए' बूलियन या इसी तरह के द्वारा। – Marty