यह इस सवाल का एक अनुवर्ती है , जिसका मैंने उत्तर दिया, लेकिन यह एक बहुत विशिष्ट विषय से निपटता है।
इस जवाब ने मुझे Entity Systems को लेख से बेहतर समझने में मदद की।
मैंने Entity Systems के बारे में लेख (हाँ) पढ़ा है , और इसने मुझे निम्नलिखित बताया:
एंटिटीज केवल एक आईडी और घटकों की एक सरणी है (लेख कहते हैं कि घटकों में संस्थाओं को संग्रहीत करना चीजों को करने का एक अच्छा तरीका नहीं है, लेकिन एक विकल्प प्रदान नहीं करता है)।
घटक डेटा के टुकड़े हैं, जो इंगित करते हैं कि एक निश्चित इकाई के साथ क्या किया जा सकता है।
सिस्टम "तरीके" हैं, वे संस्थाओं पर डेटा का हेरफेर करते हैं।
यह कई स्थितियों में वास्तव में व्यावहारिक लगता है, लेकिन घटकों के बारे में सिर्फ डेटा कक्षाएं होने का हिस्सा मुझे परेशान कर रहा है। उदाहरण के लिए, मैं एक इकाई प्रणाली में अपने वेक्टर 2 डी वर्ग (स्थिति) को कैसे लागू कर सकता हूं?
वेक्टर 2 डी वर्ग डेटा रखता है: एक्स और वाई निर्देशांक, लेकिन इसकी विधियां भी हैं, जो इसकी उपयोगिता के लिए महत्वपूर्ण हैं और कक्षा को केवल दो तत्व सरणी से अलग करते हैं। उदाहरण तरीके हैं: add()
, rotate(point, r, angle)
, substract()
, normalize()
, और अन्य सभी मानक, उपयोगी और बिल्कुल जरूरत तरीकों पदों (जो Vector2D वर्ग के उदाहरण हैं) होना चाहिए कि।
यदि घटक सिर्फ एक डेटा धारक था, तो यह इन विधियों के लिए सक्षम नहीं होगा!
एक समाधान जो संभवतः पॉप हो सकता है, उन्हें सिस्टम के अंदर लागू करना होगा, लेकिन यह बहुत ही सहज ज्ञान युक्त लगता है। ये विधियां ऐसी चीजें हैं जो मैं अब प्रदर्शन करना चाहता हूं , उन्हें पूरा करने और उपयोग करने के लिए तैयार हैं। मैं MovementSystem
संदेशों के कुछ महंगे सेट को पढ़ने के लिए इंतजार नहीं करना चाहता जो इसे एक इकाई की स्थिति पर गणना करने के लिए निर्देश देते हैं!
और, लेख बहुत स्पष्ट रूप से बताता है कि केवल सिस्टम में कोई कार्यक्षमता होनी चाहिए , और उसके लिए एकमात्र स्पष्टीकरण, जो मुझे मिल सकता है, "ओओपी से बचने के लिए" था। सबसे पहले, मुझे समझ में नहीं आता है कि मुझे संस्थाओं और घटकों में तरीकों का उपयोग करने से क्यों बचना चाहिए। मेमोरी ओवरहेड व्यावहारिक रूप से समान है, और जब सिस्टम के साथ युग्मित किया जाता है, तो उन्हें दिलचस्प तरीकों से लागू करना और संयोजित करना बहुत आसान होना चाहिए। उदाहरण के लिए, सिस्टम केवल संस्थाओं / घटकों को बुनियादी तर्क प्रदान कर सकता है, जो स्वयं कार्यान्वयन को जानते हैं। यदि आप मुझसे पूछते हैं - यह मूल रूप से ES और OOP दोनों से माल ले रहा है, तो कुछ ऐसा जो लेख के लेखक के अनुसार नहीं किया जा सकता है, लेकिन मुझे एक अच्छा अभ्यास लगता है।
इस तरह से इसके बारे में सोचो; एक खेल में कई अलग-अलग प्रकार की आकर्षित करने योग्य वस्तुएं होती हैं। पुराने चित्र, एनिमेशन ( update()
, getCurrentFrame()
आदि), इन आदिम प्रकारों के संयोजन, और ये सभी बस draw()
रेंडर सिस्टम को एक विधि प्रदान कर सकते हैं , जिसे तब ध्यान रखने की आवश्यकता नहीं है कि किसी इकाई के स्प्राइट को कैसे लागू किया जाता है, केवल इंटरफ़ेस (ड्रा) और स्थिति के बारे में। और फिर, मुझे केवल एक एनीमेशन सिस्टम की आवश्यकता होगी जो एनीमेशन-विशिष्ट तरीकों को कॉल करेगा जिसका प्रतिपादन से कोई लेना-देना नहीं है।
और सिर्फ एक अन्य बात ... क्या भंडारण घटकों की बात आती है तो वास्तव में सरणियों का एक विकल्प है? मैं किसी इकाई वर्ग के अंदर सरणियों के अलावा संग्रहीत किए जाने वाले घटकों के लिए कोई अन्य स्थान नहीं देखता ...
हो सकता है, यह एक बेहतर तरीका है: घटकों को संस्थाओं के सरल गुणों के रूप में संग्रहीत करें। उदाहरण के लिए, एक स्थिति घटक को चिपकाया जाएगा entity.position
।
केवल एक ही तरीका होगा कि सिस्टम के अंदर किसी प्रकार की अजीब लुकिंग टेबल हो , जो विभिन्न संस्थाओं को संदर्भित करती हो। लेकिन यह इकाई में बस भंडारण घटकों की तुलना में विकसित करने के लिए बहुत अक्षम और अधिक जटिल लगता है ।