इकाई-घटक प्रणाली में इकाई 'प्रकार' की पहचान करना


10

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

void PlayerCollisionSystem::update(std::vector<Entity *> entities) {
  typedef std::vector<Entity *>::iterator EIter;
  for (EIter i = entities.begin(); i != entities.end(); ++i) {
    Entity *player = *i; // How do I verify that the entity is a player?

    // Get relevant components.
    PositionComponent *position = player->getComponent<PositionComponent>();
    VelocityComponent *velocity = player->getComponent<VelocityComponent>();
    SpriteComponent *sprite = player->getComponent<SpriteComponent>();

    // Detect and handle player collisions using the components.
  }
}

खिलाड़ी और गेंद दोनों टकराव से निपटने के लिए एक ही प्रासंगिक घटक प्रकार साझा करते हैं, फिर भी उनका सिस्टम कार्यान्वयन अलग होगा।

यदि मेरे पास सभी खेल संस्थाओं का एक कंटेनर है, तो मैं विरासत के बिना Entityया सदस्य चर जैसे सहित विशिष्ट प्रकार की इकाई की पहचान कैसे करूंstd::string type , जिस स्थिति में एक इकाई अब केवल घटकों का एक संग्रह नहीं है?

जवाबों:


21

निकोल बोलस का जवाब सीधा है, लेकिन एक तरफ कदम बढ़ाते हुए और अपनी समस्या को दूर से देखते हुए: आपको वास्तव में इकाई के प्रकार की आवश्यकता नहीं है।

आपको केवल यह ध्यान रखने की ज़रूरत है कि "ऑब्जेक्ट में घटक है X" या नहीं और आपकी समस्या यह है कि आपने ठीक से पहचान नहीं की है X। यदि दो ऑब्जेक्ट अलग-अलग व्यवहार करते हैं, तो उन्हें अलग-अलग घटक दें या यदि यह अलग-अलग ऑब्जेक्ट कॉन्फ़िगरेशन के लिए अलग-अलग व्यवहार करता है तो बस घटक पर एक बूलियन ध्वज डालें। व्यवहार के बारे में निर्णय लेने के लिए घटक प्रणाली का उपयोग करें, न कि इकाई "प्रकार।" यह घटकों का उपयोग करने का पूरा बिंदु है।

यदि आपके पास PaddlePhysicsअलग-अलग BallPhysicsव्यवहार करते हैं तो आपके पास एक घटक / प्रणाली और एक अलग घटक / प्रणाली होने की पूरी तरह से अनुमति है । या आप घटकों को अधिक दानेदार टुकड़ों में तोड़ सकते हैं जैसे कि आपके पास एक Bounceघटक है जिसमें केवल गेंद है और एक StopAtBoundaryघटक है जो दोनों के पास है Ballऔर Paddleयदि व्यवहार का हिस्सा कोड साझा करने के लिए पर्याप्त है। या फिर आप सिर्फ एक बना सकते हैं PongPhysicsघटक एक बूलियन ध्वज है कि Bouncesसेट trueके लिए Ballऔर falseके लिए Paddle। तुम भी एक आधार WallCollisionघटक बना सकते हैं और फिर उस घटक को प्राप्त कर सकते हैं जो BallWallCollisionकि आवश्यक अतिरिक्त व्यवहार जोड़ता है।


4
मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए क्योंकि "वेनिला" ईसीएस के साथ कोई बाधा या समस्या नहीं है। मार्कर के रूप में काम करने वाले समर्पित घटकों को बनाकर टैगिंग संस्थाओं को आसानी से पूरा किया जा सकता है। यह सिर्फ एक डमी प्लेयरटाइपकम्पोनेंट भी हो सकता है जो केवल एक टैग के रूप में उपयोगी कुछ भी नहीं करता है।
टिगुची

19

एक प्रणाली केवल उपयोगी है यदि यह उपयोगी है। यदि एक प्रणाली जहां एक इकाई "बस घटकों का एक संग्रह" है, उस प्रणाली की तुलना में कम उपयोगी है जहां एक इकाई ज्यादातर "घटकों का संग्रह" है, तो ऐसा करें

"शुद्ध" सिस्टम बनाने की कोशिश करना बंद करें और अच्छे लोगों को बनाने पर ध्यान केंद्रित करें जो आपको चाहिए। घटकों का उपयोग तब तक करें जब तक कि घटक आपके लिए उपयोगी न हों। फिर कुछ और उपयोग करें।

आप पहले से ही इस बारे में सोचने से ज्यादा समय बिता चुके हैं कि वह इसके लायक है।


बहुत अच्छा +1 "आप पहले से ही इसके बारे में सोचने के लिए अधिक समय बिता चुके हैं, इसके लायक है"
wes

8
मुझे नहीं लगता कि यह एक उत्तर है, एक ईसीएस को परिष्कृत करने का विषय वह है जो महत्वपूर्ण ध्यान देने योग्य है, और गैरी (जब उन्होंने 2013 में इसे पोस्ट किया था) ने शायद इसके बारे में सोचने में पर्याप्त समय नहीं बिताया था। यह धारणा कि विषय अधिक समय के लायक नहीं है, का अर्थ है कि सिस्टम सरल या तुच्छ होना चाहिए और आमतौर पर हमारे समय का अवांछनीय होना चाहिए। मैं सीन मिडिलडिच के जवाब को पसंद करूंगा क्योंकि यह वास्तव में सवाल को खारिज करने के बजाय जवाब देने का प्रयास करता है।
गैविन विलियम्स

बहुत बढ़िया जवाब। मैं खुद को कभी-कभार खुद से यह कहने के लिए पाता हूं। आगे बढ़ने पर ध्यान दें।
डोमिनिक बू-समरा

5

यदि आप संस्थाओं को एक स्पष्ट प्रकार देना चाहते हैं, तो सबसे आसान तरीका इकाई वर्ग में एक प्रकार के चर को परिभाषित करना है। केवल EC पैटर्न को ही इसके उपयोगी होने तक बनाए रखें।

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

अंत में, एक अतिरिक्त घटक जोड़ सकते हैं जिसमें एक प्रकार होता है, लेकिन, इकाई में एक प्रकार जोड़ने के साथ, आप ईसी प्रणाली के उद्देश्य को हराते हुए, कई प्रकार के विशिष्ट कोड लिखेंगे।


0

एक इकाई घटकों का एक समूह है। आप किसी रैंडम सेट पर नीट लेबल असाइन नहीं कर सकते। प्रकार की कमी को पूरा करना महान लचीलेपन की कीमत है।

बेशक आपके पास विशेष (टाइप्ड) इकाई वर्ग हो सकते हैं जो घटकों पर प्रतिबंध लगाते हैं।

आदर्श रूप से घटक स्वतंत्र होते हैं। तो आपकी समस्या का समाधान क्रम में प्रत्येक उपसमिति पर टकराव से निपटने को कॉल करना होगा। वास्तविक अनुप्रयोगों में अन्योन्याश्रितता और आदेश देने की समस्याएं हैं। यदि ऐसा है तो आपको इकाई वर्ग की प्रत्येक विधि में कुछ 'प्रेषणकर्ता' तर्क की आवश्यकता है।

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