Libgdx में Box2D से फिल्टर का उपयोग करना

पिछले लेख में ContactListener साथ काम करते ContactListener देखा गया था। यहाँ केवल उदाहरण हैं जो मैंने उपयोग किए थे वे बहुत सही ढंग से चयनित नहीं थे। Box2D में फिल्टर को टक्कर देने वाले फिल्टर के लिए और अधिक सुविधाजनक साधन हैं। मैं इस बार उनके बारे में लिखूंगा।
Libgdx में Box2D से फिल्टर का उपयोग करना

टक्कर प्रसंस्करण से पहले फिल्टर संसाधित होते हैं। यही है, यदि फ़िल्टर स्तर पर हम निर्दिष्ट करते हैं कि कुछ ऑब्जेक्ट टकराते नहीं हैं, तो भविष्य में इन ऑब्जेक्ट्स के बीच कोई टकराव नहीं होगा। ContactListener का उपयोग करने के मामले में, ऐसी वस्तुओं के लिए इसके तरीके काम नहीं करेंगे। चेहरे पर अनुकूलन। अब आइए बारीकी से देखें।

श्रेणियाँ और मास्क

श्रेणियाँ और मुखौटे टक्करों को फ़िल्टर करने का सबसे शक्तिशाली तरीका है, लेकिन सबसे कठिन (शुरुआती के लिए) भी। विचार वस्तुओं के प्रकारों को वर्गीकृत करना है, और इस प्रकार की वस्तुओं के बीच टकरावों को फ़िल्टर करने के लिए मास्क का उपयोग करना है। सबसे पहले, श्रेणियों को परिभाषित करते हैं।

 // 0000000000000001 in binary final public static short CATEGORY_PLAYER = 0x0001; // 0000000000000010 in binary final public static short CATEGORY_BALOOM = 0x0002; // 0000000000000100 in binary final public static short CATEGORY_RUNNER = 0x0004; // 0000000000001000 in binary final public static short CATEGORY_SCENERY = 0x0008; 

फिर उन्हें हमारी वस्तुओं पर सेट करें।

 // f.categoryBits = MyWorld.CATEGORY_PLAYER; //   f.categoryBits = MyWorld.CATEGORY_SCENERY; // Baloom' f.categoryBits = MyWorld.CATEGORY_BALOOM; // Runner' f.categoryBits = MyWorld.CATEGORY_RUNNER; 


आपने देखा होगा कि संख्या 0 × 001, 0 × 002, 0 × 004 और 0 × 008 है। क्यों? तथ्य यह है कि श्रेणियां और मुखौटे बिट फ़ील्ड हैं (16 बिट्स में एन्कोडेड)। इसका मतलब है कि संभव श्रेणियां 2 डिग्री हैं (दशमलव संकेतन में: 1, 2, 4, 8, 16, 32, 64, 128 ..., या हेक्साडेसिमल में: 0 × 1, 0 × 2, 0 × 4, 0 × 8, 0 × 10, 0 × 20, 0 × 40, 0 × 80 ...)। 16 बिट्स का मतलब है कि 0 × 0001 से 0 × 8000 तक 16 संभावित श्रेणियां हैं।

अब मास्क परिभाषित करें।
 final public static short MASK_PLAYER = CATEGORY_RUNNER | CATEGORY_SCENERY; //  ~MASK_PLAYER final public static short MASK_BALOOM = CATEGORY_SCENERY ; final public static short MASK_RUNNER = CATEGORY_PLAYER | CATEGORY_SCENERY ; final public static short MASK_SCENERY = -1; 


संख्याओं पर विशिष्ट संचालन के साथ साधारण बूलियन बीजगणित। एक को केवल मुखौटा और परिदृश्य वस्तुओं के लिए श्रेणियों पर ध्यान केंद्रित करना है। क्यों -1 है? -1 का अर्थ है कि वस्तु अन्य सभी वस्तुओं के संपर्क में होगी। यदि आप चाहते हैं कि ऑब्जेक्ट किसी से संपर्क न करे, तो मान 0 पर सेट करें।

फिर हम अपनी वस्तुओं पर मास्क लगाएंगे।
 // f.maskBits = MyWorld.MASK_PLAYER; //   f.maskBits = MyWorld.MASK_SCENERY; // Baloom' f.maskBits = MyWorld.MASK_BALOOM; // Runner' f.maskBits = MyWorld.MASK_RUNNER; 


यदि कोई नहीं समझता है, तो कोड के टुकड़े मुखौटा और श्रेणी द्वारा प्रस्तुत किए जाते हैं। मैं आपको केवल खिलाड़ी के लिए उदाहरण के रूप में फ़िल्टर का पूरा उद्देश्य प्रदान करूंगा:
 Filter f = new Filter(); f.categoryBits = MyWorld.CATEGORY_PLAYER; f.maskBits = MyWorld.MASK_PLAYER; playerSensorFixture.setFilterData(f); playerPhysicsFixture.setFilterData(f); 

नतीजतन, खिलाड़ी केवल लैंडस्केप ऑब्जेक्ट्स और रनर के साथ बातचीत करेगा। केवल परिदृश्य के साथ बैलोम। खिलाड़ी और परिदृश्य के साथ धावक।



समूह फ़िल्टरिंग

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

शुरू करने के लिए, एक और खिलाड़ी जोड़ें।
 BodyDef def2 = new BodyDef(); def.type = BodyType.DynamicBody; Body boxP2 = world.createBody(def2); player2 = new Player(boxP2); player2.getBody().setTransform(5.0f, 1.0f, 0); player2.getBody().setFixedRotation(true); 


Player वर्ग में, एक समूह को परिभाषित करें।
 Filter f = new Filter(); f.groupIndex = -1; playerSensorFixture.setFilterData(f); playerPhysicsFixture.setFilterData(f); 

अन्य सभी वस्तुओं के लिए समूह निर्धारित करना भी आवश्यक है। बता दें कि GroupIndex प्लेटफॉर्म 3 है, और ब्लॉक 2. सिद्धांत रूप में, प्लेटफ़ॉर्म और ब्लॉक को एक समूह नहीं सौंपा जा सकता है, फिर डिफ़ॉल्ट मान को 0. पर सेट किया जाएगा। यदि आप गेम शुरू करते हैं, तो चरित्र अन्य वर्णों को छोड़कर सभी ऑब्जेक्ट से संपर्क करेगा।



आपने देखा होगा कि सूचकांक का नकारात्मक मूल्य है। यदि सूचकांक सकारात्मक है, तो वस्तुएं हमेशा संपर्क में रहती हैं, अगर यह नकारात्मक है, तो वे कभी भी संपर्क में नहीं हैं

स्रोत कोड

आप यहां से स्रोत डाउनलोड कर सकते हैं

Source: https://habr.com/ru/post/In163885/


All Articles