मैं घटक-आधारित वास्तुकला के साथ एक प्रभावी गेम ऑब्जेक्ट इंटरैक्शन योजना कैसे डिज़ाइन कर सकता हूं?


14

यह एक डिजाइन प्रश्न है ... मुझे यकीन है कि इसे और अधिक सामान्यीकृत किया जा सकता है, लेकिन मैं इसके साथ एक कठिन समय बिता रहा हूं। मैं गेम ऑब्जेक्ट इंटरैक्शन के लिए डिज़ाइन के बारे में सोच रहा हूं - यहां मेरा उदाहरण (2D पहेली-प्लेटफ़ॉर्मर) है।

कहते हैं कि खिलाड़ी एक स्तर के माध्यम से प्रगति करने की कोशिश कर रहा है। कई रोशनी हैं जिन्हें अलग-अलग दिशाओं में इंगित किया जा सकता है। यहाँ एक उदाहरण है कि कैसे इन हल्की वस्तुओं का परस्पर आदान-प्रदान हो सकता है ...

  • एक प्रकाश एक प्लेटफ़ॉर्म को प्रोजेक्ट करता है जो खिलाड़ी को एक अंतर को पार करने की अनुमति देता है
  • एक प्रकाश जो कुछ भी छूता है उसके घर्षण गुणांक को घटाता है, दूसरा इसे बढ़ाता है
  • एक प्रकाश सभी रोशनी के प्रभाव को शून्य कर देता है, जिससे प्लेटफ़ॉर्म गायब हो जाता है जबकि प्रकाश चालू रहता है और घर्षण संशोधक को शून्य कर देता है
  • आदि...

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

इसके अलावा, इन इंटरैक्शन के लिए ऑडियो कनेक्ट कर रहे हैं? ऐसा लगता है कि ऑडियो को सिस्टम से कनेक्ट करना किसी अन्य संपत्ति को जोड़ने की तरह होगा, जैसे दृश्यता या खिलाड़ी की गति / टक्कर।

जाहिर है कि जितने अधिक घटक जोड़े जाते हैं, यह अच्छा होगा यदि एक मजबूत व्यवस्था होती जो नए लोगों को थोड़ा संशोधन के साथ संभाल सकती थी, लेकिन मैं इस बारे में परिचित नहीं हूं कि इसे कैसे डिजाइन किया जाए।

अन्य जानकारी: मैं जिस इंजन का उपयोग कर रहा हूं वह एक XNA इंजन है जिसे आइसक्रीम कहा जाता है ।



2
यहाँ एक वास्तविक प्रश्न है, हालाँकि, जो जो देता है उस लिंक पर "प्रश्न" के विपरीत।
डैश-टॉम-बैंग

2
डुप्लिकेट को न देखें, सवाल यह है कि किसी विशिष्ट गेम की आवश्यकताओं को कोड में कैसे डिज़ाइन किया जाए, एक घटक प्रणाली (
@ क्रिस्‍टोफर

2
मुझे आपके गेमप्ले का तरीका =) पसंद है
नेलर

जवाबों:


5

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

  1. प्लेटफ़ॉर्म प्लेटफ़ॉर्म पर प्रकाश घटक में कोड जोड़ें। (यह काम कर लें।)
  2. उस घटक को एक नए घटक में कॉपी करें, प्लेटफ़ॉर्म के सामान को हटा दें और उपयुक्त वस्तुओं के घर्षण को कम करने के लिए कोड जोड़ें। (यह काम कर लें, सत्यापित करें कि # 1 अभी भी काम करता है।)
  3. उस घटक को एक नए घटक में कॉपी करें, "नया" कोड हटाकर अन्य घटकों के प्रभावों को अक्षम करने के लिए सामान जोड़ें। (यह काम कर लें, फिर सत्यापित करें कि # 1 और # 2 अभी भी काम करते हैं।)

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


मैं इसे उत्तर के रूप में चिह्नित कर रहा हूं क्योंकि यह वास्तव में जवाब देता है "मुझे कैसे डिजाइन करना चाहिए ..."। इसके लिए धन्यवाद, इसने निश्चित रूप से मुझे सही रास्ते पर ला खड़ा किया।
बजे क्रिस्टोफर होरेंस्टीन सेप

2

सामान्य शब्दों में, जब टाइप A का ऑब्जेक्ट B के ऑब्जेक्ट के साथ इंटरैक्ट करता है, तो आप कुछ प्रभाव सी चाहते हैं। इसे "डबल डिस्पैच" कहा जाता है और सी-लाइक भाषाओं में सुरुचिपूर्ण ढंग से करना बहुत कठिन है।

प्रभावी लेकिन हार्ड-टू-मेंटेन करने का तरीका सिर्फ स्विच का एक गुच्छा है और यदि स्टेटमेंट्स, तो आपकी वस्तुओं के प्रकार पर निर्भर करता है। आप इसे लिखने में गंदा महसूस करेंगे लेकिन यह काम पूरा कर देगा।

आगंतुक पैटर्न एक और अधिक मजबूत समाधान है कि खाल बुरा प्रकार स्विचिंग है, लेकिन clumbersome स्थापित करने के लिए हो सकता है।

आम तौर पर आपके कोड में किसी भी प्रकार का स्विच एक गंध है, लेकिन यहां आप बहुरूपता को सामान्य बनाने की कोशिश कर रहे हैं, जो सामान्य रूप से दो प्रकारों के आधार पर कार्यों को स्विच करने के लिए, एक प्रकार के आधार पर कार्यों को स्विच करता है। बहुरूपता ओओपी की एक नींव है इसलिए यह गंध नहीं है।


2

मुझे देखने दो। यह सिर्फ कुछ है जो मैंने अपने सिर में पकाया था, जबकि मैं लिख रहा था, इसलिए क्षमा करें अगर मुझे कुछ याद आ रहा है।

अपने दोस्त के आसपास एक उचित दूरी पर सभी प्रकाश नोड्स प्राप्त करें।

प्रत्येक प्रकाश के लिए आप एक बहुभुज को प्रस्तुत करते हैं जो एक फ़्रेमबफ़र ऑब्जेक्ट के लिए प्रभाव का क्षेत्र है। तो प्रकाश का एक शंकु आपके FBO में एक प्रकार के पिक्सेल का शंकु बनाएगा। उपयुक्त प्राथमिकता में पास में प्रत्येक नोड प्रकार रेंडर करें। आप हरेक पिक्सेल में जानकारी को एनकोड कर सकते हैं जैसे कि ग्रीन चैनल फ्रिकिशन हो सकता है, रेड ग्रेविटी, ब्लू और अल्फा कुछ और हो सकता है।

चतुर रंग सम्मिश्रण तकनीक फिर दिलचस्प प्रभाव पैदा कर सकता है। प्रत्येक स्तर के अपने सम्मिश्रण नियम हो सकते हैं। आप साइकेडेलिक गतिशील प्रभावों जैसे गुरुत्वाकर्षण को स्पंदित करने आदि के लिए फ्रैगमेंट शेडिंग भी जोड़ सकते हैं।

अंत में, बस जाँचें कि आपका मांडू किस पिक्सेल को छू रहा है, और जब भी आप पूर्वनिर्धारित क्षेत्र के किनारों को पास कर रहे हों तो बिटमैप का पुन: उपयोग करें।

मेरे विचार को दर्शाने के लिए 2 मिनट में किया गया रफ स्केच:

चित्रण

संपादित करें: व्यवहार में इसका मतलब केवल एक चीज है जिसकी आपको आवश्यकता है एक निश्चित रंग का प्रकाश घटक है। किस रंग से जुड़े नियम पूरी तरह से कहीं और हो सकते हैं। आप उन 32 बिट्स में बहुत सारे डेटा को एनकोड कर सकते हैं, जो आपके पास पिक्सेल हैं। वैकल्पिक रूप से आपके पास कई FBO के विभिन्न गुण हो सकते हैं जो एक दूसरे को प्रभावित नहीं करते हैं। आपके पास एक गुरुत्वाकर्षण / घर्षण FBO और एक 1bit टक्कर FBO हो सकता है। यदि आप इसे चुनते हैं, तो आपको निश्चित रूप से उस ध्वज को फहराना होगा जिसे FBO ने आपके प्रकाश में प्रस्तुत किया है।


आपके इनपुट के लिए धन्यवाद। मैं वास्तव में दृश्यों की सराहना करता हूं, और यह वास्तव में मुझे इस बारे में सोच रहा था कि मैकेनिक पर्दे के पीछे कैसे काम कर सकता है।
बजे क्रिस्टोफर होरेंस्टीन सेप

हेह, नो प्रोब। मुझे पता है कि यह आपके सटीक सवाल का जवाब नहीं था, लेकिन कुछ समस्याओं के लिए विशेष समाधान की आवश्यकता होती है। सौभाग्य!
नेलर

0

ऑब्जर्वर पैटर्न सबसे अच्छा समाधान में से एक है। संदेश केवल उन वस्तुओं (घटकों) को भेजा जाएगा जो वास्तव में इसमें रुचि रखते हैं। तो इस संदेश / घटना के प्रकार पर पुनर्विचार करना चाहिए।

कई सिग्नल / स्लॉट कार्यान्वयन हैं। उदाहरण के लिए, C ++ में एक sigslot लाइब्रेरी है

अधिक जानकारी के लिए क्यूटी सिग्नल और स्लॉट के बारे में पढ़ें ।

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