घटक-आधारित गेम में टकराव को ठीक से कैसे संभालें?


11

घटकों के आसपास डिज़ाइन किए गए गेम में टकराव को ठीक से संभालने के तरीकों के चारों ओर मेरे सिर को लपेटने की कोशिश कर रहा है।

मुझे लगता है कि कई उदाहरणों को PhysicsComponentइकाई की घटकों की सूची में जोड़ा जाता है लेकिन वास्तविक कार्यान्वयन मुझे भ्रमित कर रहा है।

इसके लिए काम करने के लिए, PhysicsComponentइसके आसपास की दुनिया तक पहुंच की आवश्यकता होगी। यह मेरे लिए सहज ज्ञान युक्त नहीं है। एक घटक को न केवल अपने कंटेनर (इकाई) से अनजान होना चाहिए, बल्कि उसके कंटेनर (दुनिया)?

मेरे लिए, ऐसा लगता है कि स्तर या दृश्य को इन संस्थाओं की सूची और प्रत्येक गेम अपडेट को बनाए रखना चाहिए, जो निर्धारित करने के लिए संस्थाओं से टकराते हैं।

मेरा प्रश्न सबसे पहले, यह अच्छा डिजाइन है या नहीं, और दूसरी बात यह है कि यह कैसे निर्धारित किया जाए कि कौन सी संस्थाएं टकरा सकती हैं। मुझे लगता है कि ठोस इकाइयां एक खाली IRigidBody इंटरफ़ेस लागू कर सकती हैं ताकि स्तर यह निर्धारित कर सके कि सूची समर्थन टकराव में कौन सी संस्थाएं हैं। लेकिन क्या यह घटक डिजाइन को तोड़ रहा है?

इसके बजाय, उन्हें एक खाली रिगिडबॉडी घटक होना चाहिए? यह वास्तव में बेहतर हो सकता है क्योंकि यह हमेशा खाली नहीं हो सकता है और यह दृष्टिकोण अधिक भविष्य का सबूत है। इसके साथ एकमात्र समस्या जटिलता है। दृश्य में न केवल प्रत्येक इकाई के माध्यम से लूप करना होगा, बल्कि यह निर्धारित करने के लिए कि यह RigidBody घटक है, यह निर्धारित करने के लिए प्रत्येक इकाई के घटक भी होंगे।

तीसरा, जब वे टकराते हैं तो दोनों संस्थाओं को किसी तरह सूचित किया जाना चाहिए और मैं इस बारे में अनिश्चित हूं कि इसे कैसे पूरा किया जाए।

मान लीजिए कि दोनों संस्थाओं में एक स्वास्थ्य सेवा निहित है और जब वे टकराएंगे तो उनके दोनों स्वास्थ्य कुछ मनमाने मूल्य से कम हो जाएंगे, 5. मुझे लगता है कि जब दो संस्थाओं के बीच टकराव का पता चलता है तो इसे संभालना दृश्य की जिम्मेदारी होगी?

लेकिन फिर क्या दृश्य बहुत अधिक के लिए जिम्मेदार है? मैं देख सकता हूं कि यह संभवत: हाथ से निकल रहा है और जब यह दृश्य कई चीजों के लिए जिम्मेदार नहीं है, तब तक यह बेकार है।

संपादित करें: अधिक विवरण के साथ अद्यतन किया गया प्रश्न।


4
यह उत्तर लिंक करने के लिए उचित लगता है: gamedev.stackexchange.com/questions/13797/…
एंड्रयू रसेल

एंड्रयू का जुड़ा जवाब, जेम्स का जवाब, और निक विग्गिल का जवाब सभी के लायक + 1s है। डेटा और विधियों दोनों के साथ एक विशिष्ट वर्ग के रूप में डेटा की तुलना में घटकों के बारे में अधिक सोचें (ऐसा नहीं है कि उनके पास तरीके नहीं होंगे, लेकिन उन्हें बहुत जिम्मेदारी नहीं दी जानी चाहिए)। एक अच्छे घटक ढांचे के उदाहरण के लिए आर्टेमिस घटक प्रणाली ( piemaster.net/2011/07/entity-component-artemis ) देखें।
michael.bartnett

जवाबों:


5

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

उस अंत तक मैं आपके साथ पहले कहा गया था और भौतिकी के घटकों के साथ जाऊँगा जहाँ मौजूद वस्तुओं को उनकी टक्कर के लिए परीक्षण करने की आवश्यकता होती है। अब स्पष्ट रूप से इन वस्तुओं को टकराव के रिज़ॉल्यूशन पर स्वयं के अन्य घटकों को सूचित करना पड़ सकता है, लेकिन जैसा कि उल्लेख किया गया है, यह वह जगह है जहां मैं स्वयं इवेंट को केवल अन्य इंटरफ़ेस के माध्यम से ऑब्जेक्ट्स के लिए बाहर जाना पसंद करता हूं (या तो प्रबंधक या इवेंट मैसेजिंग सिस्टम के माध्यम से यदि आप उदाहरण के लिए उनमें से एक है)।

मुझे लगता है कि आप सही रास्ते पर हैं और बस एक 'हां, जो सही लगता है' की ज्यादा जरूरत है .. हां, यह सही लगता है।

उम्मीद है की यह मदद करेगा!


3

आम तौर पर खेल इंजन संस्थाओं के बीच टकराव का पता लगाने के लिए एक 3 पार्टी पुस्तकालय का उपयोग करते हैं। इस परिदृश्य में, कोई भी उन संस्थाओं को बनाता या पंजीकृत करता है जिनके पास "भौतिकी" दुनिया में PhysicsComponent है। और जब भी यह दो संस्थाओं (ए और बी) के बीच टकराव का पता लगाता है, तो यह आम तौर पर इकाई ए को सूचित करेगा कि वह इकाई बी और इकाई बी के खिलाफ टकरा गया है, यह सूचित करते हुए कि यह इकाई ए के खिलाफ टकरा गया है।

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


2

आपको जो समस्या है वह टकराव का पता लगाने में है (जो एकमात्र कारण है कि आपको एक भौतिक विज्ञान-घटक-असर इकाई की आवश्यकता होगी जैसे किसी अन्य को संदर्भित करने के लिए) एक उच्च स्तर पर किया जाता है, आमतौर पर या तो आपके गेम लूप द्वारा, या सीधे एक सहायक कार्य / वर्ग जो ऐसा करता है। कुछ हफ़्ते पहले किसी को मेरा जवाब समान आधार पर निकाले जाने के बारे में बात करता है, और यह ध्यान में रखते हुए कि यदि टक्कर से आपकी कोई संस्था नष्ट हो जाती है, तो वही जवाब, उसके दिए गए संदर्भ में, आपके लिए बहुत प्रासंगिक होने वाला है। , क्योंकि एक "उच्च शक्ति" अभी भी निकायों की सफाई का प्रबंधन करने जा रही है ... इसलिए बोलने के लिए।

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


2

मैं एक परियोजना में अब आप के रूप में एक ही समस्या का सामना कर रहा हूँ। जिस तरह से मैंने इससे निपटने का फैसला किया वह एक "ColliderComponent" है जो शरीर को भौतिकी इंजन से रखता है। बॉडीज़ को बाहरी रूप से परिभाषित किया जाता है (आकार परिभाषाएँ जो रनटाइम पर लोड की जाती हैं) और फिर भौतिकी-दुनिया और खेल-संस्थाओं के लिए उन्हें जोड़ा जाता है।

मैं Box2D का उपयोग कर रहा हूं जहां आप "टक्कर-श्रोता" को संलग्न कर सकते हैं जो टक्कर से अधिसूचित हो जाएगा। चूँकि मैं अपने "ColliderComponent" को पॉड्स यूज़र-डेटा में पॉइंटर जोड़ता हूँ, इसलिए मैं अपने दो ColliderCompords को प्राप्त कर सकता हूँ जो टक्कर का हिस्सा थे।

तो वह चीज जो तब होती है जब टकराव होता है, निम्नलिखित है: ColliderCompords जो टक्कर का हिस्सा थे, उनके मालिक-ऑब्जेक्ट (खेल-इकाई) को एक संदेश भेजेंगे जो बदले में उस संदेश को उसके सभी घटकों में प्रसारित करेगा।

प्रत्येक घटक तब उस संदेश पर प्रतिक्रिया कर सकता है, इसलिए आपका "स्वास्थ्य-घटक" स्वास्थ्य से 5 अंक निकाल सकता है, आदि।


+1: मैं एक बहुत ही समान दृष्टिकोण का उपयोग कर रहा हूं। आप टकराव के प्रकार के आधार पर नुकसान की मात्रा का निर्धारण कैसे करते हैं?
डेन

@ क्या मैं उस टक्कर के अनुसार अलग-अलग संदेश (या संदेश डेटा) भेजता हूं। यह मेरे लिए ठीक काम करता है, क्योंकि मेरे पास संभालने के लिए बहुत सारे मामले नहीं हैं।
बंमज़ैक

0

एक टकराव प्रणाली बनाएं जो टकराव "दुनिया" को जानता है। फिर अपने टकराव घटक में टकराव प्रणाली को बिंदु A से B तक किरण डालना और जवाब देना चाहिए कि यह टकराया या नहीं।

सौभाग्य। मैं टकराव प्रणाली को गेम इंजन के अधिक थकाऊ भागों में से एक मानता हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.