संपादित करें: यह स्पष्ट करने के लिए कि वास्तव में मेरा प्रश्न क्या है: क्या यह सामग्री निर्माण / प्रबंधन पर आंख के साथ एक गेम इंजन में एनिमेशन / एनीमेशन राज्य को संभालने का एक अच्छा तरीका है? इस तरह से करने में क्या खामियां हैं और इसे करने का एक वैकल्पिक तरीका क्या होगा? - हालांकि मेरे जवाब को टिप्पणियों में आंशिक रूप से जवाब मिला, क्योंकि यह जाने का रास्ता लगता है।
मैं एक 2 डी गेम इंजन शौक परियोजना में एनिमेशन को संभालने की कोशिश कर रहा हूं , बिना हार्ड-कोडिंग के। हार्ड कोडिंग एनिमेशन स्टेट्स मेरे लिए एक आम लेकिन बहुत अजीब घटना की तरह लगती हैं।
एक छोटी पृष्ठभूमि: मैं एक इकाई प्रणाली के साथ काम कर रहा हूं जहां घटक डेटा के बैग हैं और उपप्रणाली उन पर कार्य करती हैं। मैंने एनीमेशन राज्यों को अपडेट करने के लिए एक मतदान प्रणाली का उपयोग करने के लिए चुना।
साथ एनीमेशन राज्यों मेरा मतलब है: "walking_left", "running_left", "walking_right", "शूटिंग", ...
एनिमेशन को संभालने का मेरा विचार इसे डेटा संचालित मॉडल के रूप में डिजाइन करना था । डेटा को एक xml फ़ाइल, एक rdbms, में संग्रहीत किया जा सकता है ... और एक गेम / स्तर / के प्रारंभ में लोड किया जा सकता है ... इस तरह से आप आसानी से एनिमेशन और बदलाव संपादित कर सकते हैं बिना अपने कोड में हर जगह परिवर्तन किए। खेल।
एक उदाहरण के रूप में मैंने उन डेटा परिभाषाओं का एक xml ड्राफ्ट बनाया, जो मेरे दिमाग में थे।
डेटा का एक बहुत महत्वपूर्ण टुकड़ा बस एक एनीमेशन का वर्णन होगा । एक एनीमेशन में एक अद्वितीय आईडी (एक वर्णनात्मक नाम) होगा। यह एक छवि के लिए एक संदर्भ आईडी धारण करेगा (यह स्प्राइट शीट का उपयोग करता है, क्योंकि विभिन्न एनिमेशन अलग-अलग स्प्राइट शीट का उपयोग कर सकते हैं)। एनीमेशन को चलाने के लिए प्रति सेकंड फ्रेम। यहां "रीप्ले" परिभाषित करता है कि क्या एनीमेशन को एक बार या असीम रूप से चलाया जाना चाहिए। फिर मैंने फ्रेम के रूप में आयतों की एक सूची को परिभाषित किया।
<animation id='WIZARD_WALK_LEFT'>
<image id='WIZARD_WALKING' />
<fps>50</fps>
<replay>true</replay>
<frames>
<rectangle>
<x>0</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
<rectangle>
<x>45</x>
<y>0</y>
<width>45</width>
<height>45</height>
</rectangle>
</frames>
</animation>
एनीमेशन डेटा को एक एनीमेशन संसाधन पूल में लोड और आयोजित किया जाएगा और खेल संस्थाओं द्वारा संदर्भित किया जाएगा जो इसका उपयोग कर रहे हैं। यह एक छवि, एक ध्वनि, एक बनावट, जैसे संसाधन के रूप में माना जाएगा ...
परिभाषित करने के लिए डेटा का दूसरा टुकड़ा एनीमेशन राज्य और संक्रमण को संभालने के लिए एक राज्य मशीन होगा । यह परिभाषित करता है कि प्रत्येक राज्य एक खेल इकाई में हो सकता है, जो यह बताता है कि यह किस राज्य में परिवर्तन कर सकता है और क्या बदल सकता है।
यह राज्य मशीन इकाई से इकाई में भिन्न होगी। क्योंकि एक पक्षी में "चलने" और "उड़ने" की स्थिति हो सकती है, जबकि एक मानव के पास केवल "चलने" की अवस्था होगी। हालाँकि, इसे विभिन्न संस्थाओं द्वारा साझा किया जा सकता है क्योंकि कई मनुष्यों में संभवतः एक ही स्थिति होगी (विशेषकर जब आप कुछ सामान्य एनपीसी जैसे कि राक्षस, आदि को परिभाषित करते हैं)। इसके अतिरिक्त एक orc में एक मानव के समान राज्य हो सकते हैं। बस यह प्रदर्शित करने के लिए कि यह राज्य परिभाषा साझा की जा सकती है लेकिन केवल खेल संस्थाओं के एक चुनिंदा समूह द्वारा ।
<state id='IDLE'>
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_LEFT'>
<event trigger='LEFT_UP' goto='IDLE' />
<event trigger='RIGHT_DOWN' goto='MOVING_RIGHT' />
</state>
<state id='MOVING_RIGHT'>
<event trigger='RIGHT_UP' goto='IDLE' />
<event trigger='LEFT_DOWN' goto='MOVING_LEFT' />
</state>
इन राज्यों को एक मतदान प्रणाली द्वारा नियंत्रित किया जा सकता है । प्रत्येक खेल टिक यह एक खेल इकाई की वर्तमान स्थिति पकड़ लेता है और सभी ट्रिगर की जाँच करता है। यदि कोई शर्त पूरी होती है तो यह इकाई की स्थिति को "गोटो" स्थिति में बदल देता है।
पिछले भाग मैं संघर्ष कर रहा था कि एनीमेशन डेटा और एनीमेशन राज्यों को एक इकाई में कैसे बांधें । सबसे तार्किक दृष्टिकोण मुझे ऐसा लगा कि राज्य मशीन के डेटा का एक पॉइंटर जो एक इकाई का उपयोग करता है और उस मशीन में प्रत्येक राज्य के लिए परिभाषित करता है जो एनीमेशन का उपयोग करता है।
यहाँ एक xml उदाहरण है कि मैं एनीमेशन स्टेट और एनीमेशन डेटा आईडी को संबोधित करके एक गेम में कुछ सामान्य संस्थाओं के एनीमेशन व्यवहार और चित्रमय प्रतिनिधित्व को कैसे परिभाषित करूंगा। ध्यान दें कि "विज़ार्ड" और "orc" दोनों में एक ही एनीमेशन स्टेट्स हैं लेकिन एक अलग एनीमेशन है। इसके अलावा, एक अलग एनीमेशन का अर्थ एक अलग स्प्राइट शीट, या एनिमेशन का एक अलग अनुक्रम भी हो सकता है (एक एनीमेशन लंबा या छोटा हो सकता है)।
<entity name="wizard">
<state id="IDLE" animation="WIZARD_IDLE" />
<state id="MOVING_LEFT" animation="WIZARD_WALK_LEFT" />
</entity>
<entity name="orc">
<state id="IDLE" animation="ORC_IDLE" />
<state id="MOVING_LEFT" animation="ORC_WALK_LEFT" />
</entity>
जब इकाई बनाई जा रही है, तो यह राज्य मशीन डेटा और एनीमेशन डेटा संदर्भ वाले राज्यों की सूची जोड़ देगा।
भविष्य में मैं एक समान xml प्रारूप में घटकों को परिभाषित करके संपूर्ण संस्थाओं के निर्माण के लिए इकाई प्रणाली का उपयोग करूंगा।
-
यह मैं कुछ शोध के बाद लेकर आया हूं। हालांकि मुझे इसके चारों ओर अपना सिर पाने में कुछ परेशानी थी, इसलिए मैं कुछ प्रतिक्रिया की उम्मीद कर रहा था। क्या यहाँ कुछ है जो समझ में नहीं आता है, या इन चीजों को संभालने का एक बेहतर तरीका है? मैंने तख्ते के माध्यम से पुनरावृत्ति करने के विचार को समझा लेकिन मुझे इसे एक कदम आगे ले जाने में परेशानी हो रही है और ऐसा करने का मेरा प्रयास है।