तेज, सटीक 2d टक्कर


17

मैं एक 2d टॉपडाउन शूटर पर काम कर रहा हूं, और अब मुझे अपने मूल आयत बाउंडिंग बॉक्स टक्कर सिस्टम से परे जाने की आवश्यकता है।

मेरे पास कई अलग-अलग स्प्राइट्स के साथ बड़े स्तर हैं, जिनमें से सभी अलग-अलग आकार और आकार हैं। स्प्राइट के लिए बनावट पारदर्शी पृष्ठभूमि के साथ सभी वर्ग png फाइलें हैं, इसलिए मुझे भी केवल एक टक्कर की आवश्यकता होती है जब खिलाड़ी बनावट के रंगीन हिस्से में चलता है, और पारदर्शी पृष्ठभूमि नहीं।

मैं टक्कर को संभालने की योजना इस प्रकार है:

  1. जांचें कि कोई स्प्राइट खिलाड़ी की सीमा में है या नहीं
  2. एक रेक बाउंडिंग बॉक्स टकराव परीक्षण करें
  3. एक सटीक टक्कर करें (जहां मुझे मदद की ज़रूरत है)

मुझे उन्नत तकनीकों से ऐतराज नहीं है, क्योंकि मैं अपनी सभी आवश्यकताओं को ध्यान में रखते हुए यह अधिकार प्राप्त करना चाहता हूं, लेकिन मुझे यकीन नहीं है कि यह कैसे होगा। क्या तकनीक या यहां तक ​​कि पुस्तकालयों की कोशिश करने के लिए। मुझे पता है कि मुझे संभवतः किसी प्रकार के आकार को बनाने और संग्रहीत करने की आवश्यकता होगी जो प्रत्येक स्प्राइट माइनस को पारदर्शी पृष्ठभूमि का सटीक रूप से प्रतिनिधित्व करता है।

मैंने पढ़ा है कि प्रति पिक्सेल धीमा है, इसलिए मेरे बड़े स्तर और वस्तुओं की संख्या को देखते हुए मुझे नहीं लगता कि यह उपयुक्त होगा। मैंने Box2d को भी देखा है, लेकिन यह बहुत अधिक प्रलेखन, या इसे कैसे प्राप्त करने और SFML के साथ चलने के किसी भी उदाहरण को खोजने में सक्षम नहीं है।

जवाबों:


18
  1. एक कदम, एक ग्रिड बनाएं और इसे हर उस वस्तु के लिए अपडेट करें जो चलती है।
  2. केवल एक ही वर्ग में वस्तुओं के बीच टकराव की जाँच करें।
  3. जांचें कि क्या ऑब्जेक्ट्स का बाउंडिंग बॉक्स इंटरसेक्शंस (उनकी आयत युक्त) है।
  4. बाह्यरेखा के कम रेस संस्करण का उपयोग करके पिक्सेल सही टक्कर की जाँच करें (गेम भौतिकी देखें)।
  5. खेल भौतिकी (Q 2) में वर्णित रूपरेखा अनुरेखण की सामान्य जांच करें

चरण 1:

एक ग्रिड बनाएं 2d सरणी। हर वस्तु जानती है कि वह किस वर्ग में रहती है, यह x, y स्थिति है और यह चौड़ाई और ऊंचाई है। यदि किसी वस्तु को दूर ले जाया जाता है, तो यह पुराने वर्ग से अपने आप को साफ कर देता है और नए वर्ग को अपडेट करता है, जिस पर उसका कब्जा है।

यह कुल वस्तुओं के लिए केवल O (n) लेता है। किसी विशिष्ट वस्तु O (1) के लिए।

चरण 2:

एक ही वर्ग में वस्तुओं के बीच टकराव के लिए सभी चेक चलाएँ। विभिन्न वर्गों में वस्तुओं के बीच टकराव के लिए परीक्षण चलाने की आवश्यकता नहीं है। यदि कोई वस्तु औसत आकार की है तो एक वस्तु चार वर्ग तक की हो सकती है। इसका मतलब है बहुत कम जांच।

चरण 3:

वस्तुओं के बीच चौराहे के लिए जाँच करें आयताकार। यदि कोई चौराहा मौजूद नहीं है, तो रुकें।

चरण 4:

केवल चौराहे के क्षेत्र के अंदर वस्तुओं की रूपरेखा के बीच पिक्सेल सही टकराव की जाँच करें। यह काफी तेज होना चाहिए। यदि नहीं, तो कम रेस 2 डी-बूलियन सरणी बनाएं और पहले इसे जांचें, यदि आपको वहां टक्कर मिलती है, तो आपको केवल उच्च रिस 2 डी-सरणी में एक छोटे सेगमेंट की जांच करने की आवश्यकता होगी, जिससे आपको कुछ कीमती समय की बचत होगी।

अपने गेम की दुनिया को चौकों के ग्रिड में कैसे विभाजित करें, इस अवधारणा के लिए कृपया इसे पढ़ें :

एक कुशल टक्कर का पता लगाने प्रणाली बनाना

पिक्सेल सटीक टकराव का पता लगाने के तरीके के बारे में जानने के लिए कृपया इसे पढ़ें ।

खेल भौतिकी / 2D टकराव का पता लगाने AS3

आप प्रदर्शन में काफी सुधार कर सकते हैं:

  1. पहले के खिलाफ जाँच करने के लिए रूपरेखा के निम्न रेस (1/16) संस्करण को सहेजना।

  2. केवल उस क्षेत्र में जाँच की जा रही है जहाँ दोनों ने प्रतिच्छेद किया है।

  3. मोटे तौर पर रूपरेखा को खंडों में विभाजित करके, और केवल खंडों के बीच टकराव के लिए जाँच कर रहा है।

कृपया टिप्पणी में आपका स्वागत है और मैं विस्तार से बताऊंगा।

चौराहे के क्षेत्र में जाँच करें


1
जैसा कि आर्थर ने कहा, अपने चरण 1 और 2 को ग्रिड से बदलें, और सटीक टकराव का पता लगाने के लिए, आप अपनी छवियों के कम रिज़ॉल्यूशन संस्करण का उपयोग कर सकते हैं।
मार्कस वॉन ब्रॉडी

1
और अगर आपको वास्तव में जरूरत है, तो आप मेरे जवाब के लिए भी इसी तरह की तकनीक का इस्तेमाल कर सकते हैं: gamedev.stackexchange.com/questions/38481/…
मार्कस वॉन ब्रॉडी

मार्कस एक अच्छा विचार बताते हैं। आपको 2d-boolean array या 1d-array का उपयोग करना चाहिए जिसे 2d के रूप में माना जाता है और आप चीजों को गति देने के लिए उस सरणी के 1/2 1/4 1/8 कम- res संस्करणों को बचा सकते हैं। यह शायद आवश्यक नहीं होगा क्योंकि 2 डी-बूलियन सरणियों पर गणना बहुत तेज है। यह अभी भी एक उपयोगी उपकरण है।
वुल्फडॉन

यदि खिलाड़ी ग्रिड पर एक वर्ग के अंदर पूरी तरह से निहित है, तो आप केवल उस वर्ग में वस्तुओं के खिलाफ जांच कर सकते हैं। खिलाड़ी एक साथ चार आसन्न वर्गों में हो सकता है। क्या यही मतलब है तुम्हारा? यदि आपके पास आयतों के बीच के चौराहे का मतलब है, तो हाँ, आपको केवल टकरावों की जांच करने की आवश्यकता है यदि वे प्रतिच्छेद करते हैं।
वुल्फडॉन

1
मुझे आशा है कि अद्यतन स्पष्ट चीजों को ऊपर लाने में मदद करता है। एक बार आपके पास कुछ कोड लिखे जाने के बाद आप इसे कोड समीक्षा में पोस्ट कर सकते हैं और हमें टिप्पणियों के लिए लिंक कर सकते हैं। codereview.stackexchange.com
wolfdawn
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.