2010-11-30 27 views
16

में टकराव का पता लगाने का प्रबंधन इसलिए मेरा प्रश्न टकराव का पता लगाने के बारे में नहीं है, लेकिन यह व्यापक है कि 'कोड को टकराव का पता लगाना चाहिए'। मैंने अतीत में कुछ गेम लिखा है (अपेक्षाकृत सरल 2 डी फ़्लैश गेम्स) और यह मुझे सोच रहा है कि किस कोड को टकराव का पता लगाना चाहिए?गेम

मुझे स्पष्टीकरण दें - एक गेम में कहें कि मेरे पास दुश्मनों का समूह है और प्रोजेक्टाइल के समूह ने खिलाड़ी को निकाल दिया है। तो अतीत में मैंने एक एनिमी मैनेजर क्लास कहा था, कि हर फ्रेम दुश्मनों की स्थिति को अद्यतन करता है और इसी प्रकार प्लेयर प्रोजेक्टाइल के लिए प्लेयरप्रोजेक्ट मैनेजर क्लास था जो गोलियों के चारों ओर चले गए थे। यह अच्छा है - सब कुछ ठीक और बेवकूफ है। लेकिन फिर, मैं तय करता हूं कि मैं गोलियों को पर दुश्मनों को पागल करना चाहता हूं (पागल मुझे पता है!)।

  1. चित्रा बाहर जो गोलियों और दुश्मनों टकराने कर रहे हैं प्रत्येक टक्कर

तो के जवाब बाहर (मैं इस सवाल के लिए कैसे परवाह नहीं है)

  • चित्रा: ताकि कोड मैं करने की जरूरत में कहीं का मतलब मूल रूप से मैंने जो किया है वह सिर्फ एनीमैनगर क्लास टकराव का 'स्वामित्व' लेता है, और इसके अपडेट लूप के दौरान यह खिलाड़ी बुलेट्स को पाता है जो दुश्मन गोलियों (यानी चरण 1) से टकराते हैं और दोनों ऑब्जेक्ट्स के लिए कोड भी कहते हैं टकराव को संभालने के लिए (जैसे दुश्मन स्वास्थ्य को नुकसान पहुंचाता है, बुलेट गायब हो जाता है) (यानी चरण 2)। तो मैंने एनीमैनगर को टकराव का पता लगाने और टक्कर 'प्रतिक्रिया' का नियंत्रण दिया है।

    उस के बारे में एक जोड़े की टिप्पणियां:

    • यह मनमाने ढंग से अलग-अलग महसूस करता है मुझे लगता है कि EnemyManager 'नियंत्रण' में है बजाय PlayerProjectilesManager
    • दोनों टक्कर का पता लगाने और टकराव की प्रतिक्रिया 'एक ही मालिक द्वारा नियंत्रित किया जाता है , यह मेरे दृष्टिकोण से

    मेरे दिमाग में क्या हो रहा है यह एक तृतीय पक्ष इकाई टकराव का पता लगाने का प्रबंधन है। उदाहरण के लिए एक CollisionManager है जिसमें कोड है जो जानता है कि अन्य प्रबंधकों को टकराव का पता लगाने की आवश्यकता है। इससे अन्य प्रश्नों की ओर इशारा होता है जैसे कि 'प्रबंधक' को टकराव प्रबंधक को बहुत सारे अंदरूनी पर्दाफाश किए बिना कुशल टकराव का पता लगाने के लिए क्या इंटरफेस करना पड़ता है। तो मुझे लगता है कि CollisionManager ने किसी प्रकार की घटना को किस प्रकार प्रसारित किया है, जिसमें 2 ऑब्जेक्ट्स टकराए गए हैं ... और शायद एनी मैनेजर/प्लेयरप्रोजेक्टाइल मैनेजर अलग-अलग इन घटनाओं को सुन सकता है और तदनुसार और अलग से प्रतिक्रिया दे सकता है। मेरे दिमाग में समझने लगते हैं। :)

    विचार? लगभग हर गेम में टकराव का पता लगाना पड़ता है, इसलिए मुझे यकीन है कि इससे पहले चर्चा की गई है। :)

  • उत्तर

    11

    यह एक अच्छा सवाल है। निजी तौर पर, मैं "प्रबंधकों" का उपयोग कर इसे जटिल नहीं करता। मान लें कि हमारे पास गेमइंजिन है, जो गेम को अपने मुख्य लूप में चलाता है। इस मुख्य पाश में 3 कदम हो सकते हैं: उपयोगकर्ता इनपुट प्राप्त करें, गेम में सभी ऑब्जेक्ट्स की स्थिति अपडेट करें (उपयोगकर्ता इनपुट के आधार पर) और आखिरकार स्क्रीन पर सबकुछ खींचें।

    टकराव का पता लगाने के बारे में सबकुछ दूसरे चरण में किया जाता है - ऑब्जेक्ट्स राज्य को अपडेट करते समय। मान लें कि गेम में सभी ऑब्जेक्ट्स पूल में संग्रहीत हैं। इसमें खिलाड़ी, गोलियां, दुश्मन और यहां तक ​​कि दुनिया भी शामिल है (यदि आप दुनिया को किसी भी तरह से प्रभावित करना चाहते हैं)। सभी अलग-अलग वस्तुओं में कुछ सामान्य गुण हो सकते हैं - वे ड्रायबल, मूवबल, कोलाइडबल ईटीसी। (इन गुणों को रखने के लिए इंटरफेस को लागू करने या बेस क्लास को विस्तारित करने की तरह सोचें)

    इन गुणों में से प्रत्येक के लिए मेरे पास कक्षा में सभी वस्तुओं के साथ कुछ ऐसा वर्ग होगा। Mover.moveAll (ऑब्जेक्ट्स फ्रॉमपूल) की तरह।यह सभी वस्तुओं को स्थानांतरित करेगा, जो चलने योग्य हैं। टकराव का पता लगाने के लिए वही -> जब हम मोवर के साथ ऑब्जेक्ट्स को स्थानांतरित कर लेते हैं, तो हम CollisionDetector.cehckAll (ऑब्जेक्ट्सप्रॉमपूल) के साथ टकराव की जांच करते हैं। यह चेकअल() विधि ऑब्जेक्ट्स के बीच वास्तविक टकराव का पता लगाएगी, जो उनके निर्देशांक को जानती है। यदि कोई ऑब्जेक्ट कोलाइडेबल है, तो CollisionDetector अपनी विधि को कोलाइड (withOtherObject) पर बुलाएगा और तब ऑब्जेक्ट स्वयं ठीक से प्रतिक्रिया करता है, इस पर निर्भर करता है कि अन्य ऑब्जेक्ट ने इसे किस प्रकार मारा। मान लें, अगर खिलाड़ी दुश्मन के शरीर से छुआ है, तो वे दोनों उदाहरण के लिए वापस कदम उठाएंगे। यदि एक बुलेट किसी अन्य बुलेट द्वारा हिट किया जाता है - तो वे दोनों को हटाने के लिए चिह्नित किया जाएगा। यदि दुश्मन को बुलेट से मारा जाता है, तो कुछ नुकसान होगा और बुलेट को हटाने के लिए चिह्नित किया जाएगा। ये सभी प्रतिक्रियाएं संबंधित वस्तुओं में स्वयं होनी चाहिए। टक्कर डिटेक्टर किसी भी दो ऑब्जेक्ट्स के बीच टकराव का पता लगाने के लिए अपने एल्गोरिदम लागू करता है और फिर अपने कोलाइड (withOtherObjct) विधि को आमंत्रित करता है। यदि कोई ऑब्जेक्ट कोलाइडेबल नहीं है, तो इसे आसानी से CollisionDetector द्वारा अनदेखा किया जाएगा (उदाहरण के लिए बारिश कण या धूल को संकुचित नहीं किया जा सकता है)।

    मुझे आशा है कि मैं अपने आप को सही :) व्यक्त करने के लिए

    0

    प्रश्न माध्यम से विकास कर रहे हैं सबसे अच्छा खेल के लिए https://gamedev.stackexchange.com/ के लिए विशिष्ट कामयाब रहे।

    तो अतीत में मैं मिला है एक EnemyManager वर्ग

    मैं किसी भी SomethingManager वर्ग एक संकेत है कि अपने कोड सही रूप में अभी तक संगठित नहीं है पर विचार का कहना है। अधिकांश भाग के लिए, वस्तुओं को स्वयं का प्रबंधन करना चाहिए। यदि वे नहीं कर सकते हैं, तो इसका तात्पर्य है कि उनके बारे में कुछ बाहरी जानकारी है, और उस जानकारी में शायद 'प्रबंधक' से अधिक विशिष्ट प्रतिनिधित्व हो। 3 गेम-विशिष्ट उदाहरण गेमवर्ल्ड, गेमरियन, या गेमलेवल हो सकते हैं। दुश्मन एक दुनिया, या दुनिया के एक क्षेत्र, या एक मौजूदा खेल स्तर के भीतर मौजूद हैं, इसलिए ऐसी वस्तु दुश्मनों की सूची बनाए रखती है।

    खिलाड़ी प्रोजेक्टाइल के लिए

    और इसी तरह एक PlayerProjectilesManager वर्ग

    प्रोजेक्टाइल भी खेल की जगह, एक दुनिया, क्षेत्र, या स्तर के कुछ प्रकार में रहते हैं होता था।

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