डेटा-चालित एनीमेशन स्टेट्स


14

संपादित करें: यह स्पष्ट करने के लिए कि वास्तव में मेरा प्रश्न क्या है: क्या यह सामग्री निर्माण / प्रबंधन पर आंख के साथ एक गेम इंजन में एनिमेशन / एनीमेशन राज्य को संभालने का एक अच्छा तरीका है? इस तरह से करने में क्या खामियां हैं और इसे करने का एक वैकल्पिक तरीका क्या होगा? - हालांकि मेरे जवाब को टिप्पणियों में आंशिक रूप से जवाब मिला, क्योंकि यह जाने का रास्ता लगता है।

मैं एक 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 प्रारूप में घटकों को परिभाषित करके संपूर्ण संस्थाओं के निर्माण के लिए इकाई प्रणाली का उपयोग करूंगा।

-

यह मैं कुछ शोध के बाद लेकर आया हूं। हालांकि मुझे इसके चारों ओर अपना सिर पाने में कुछ परेशानी थी, इसलिए मैं कुछ प्रतिक्रिया की उम्मीद कर रहा था। क्या यहाँ कुछ है जो समझ में नहीं आता है, या इन चीजों को संभालने का एक बेहतर तरीका है? मैंने तख्ते के माध्यम से पुनरावृत्ति करने के विचार को समझा लेकिन मुझे इसे एक कदम आगे ले जाने में परेशानी हो रही है और ऐसा करने का मेरा प्रयास है।


1
मैं एनीमेशन डेटा संग्रहीत करने के लिए एक समान विचार के साथ आया हूं, हालांकि मैंने ट्रिगर्स पर विचार नहीं किया है। यहाँ एक छोटा लेख है, जिसके बारे में मैंने लिखा है और एक XNA प्रोजेक्ट का लिंक जो मैंने लिखा है कि XML का उपभोग करता है और चीजों के एनीमेशन पक्ष को संभालता है। मेरे पास कुछ चीजें हैं जो अलग हैं, जैसे कि सेट और सीक्वेंस की अवधारणा, लेकिन इसके अलावा, मुझे लगता है कि आप ट्रैक पर हैं।
जॉन मैकडॉनल्ड्स

2
ऐसा नहीं है कि आपका डिज़ाइन खराब है (ऐसा नहीं है, यह एक समान प्रणाली की तर्ज पर है जो मैंने पिछले समय में बनाया था), लेकिन वास्तव में यहाँ आपका सवाल क्या है? मुझे लगता है कि यह वास्तव में स्पष्ट हो सकता है।
MrCranky

@ जॉन - धन्यवाद दोस्त, मैं आज शाम को इस पर एक नज़र डालूँगा। @ MrCranky - ठीक है, ज्यादातर आपने क्या कहा। यदि यह किसी भी अच्छे और संभवतः अधिक स्थापित तरीकों के लिए सुझाव / लिंक है। मैं वास्तव में यहां अंधेरे में अनुभव-बुद्धिमान हूं।
user8363

1
मैं इसे प्रदान की गई जानकारी की गहराई के लिए एक उत्थान देना चाहूंगा लेकिन, MrCranky को प्रतिध्वनित करने के लिए, मैं वास्तव में प्रश्न का अनुसरण नहीं कर रहा हूं। मेरी अपनी व्यक्तिगत सलाह के लिए (जो कुछ हफ़्ते पहले इस तरह का सिस्टम बनाने से बचती है) मैं कहता हूँ कि आप हाजिर हैं।
माइक क्लच

@ मायके बस इतना ही जवाब मुझे चाहिए था। मैं इस तथ्य के लिए माफी माँगता हूँ कि मैं अपने प्रश्न पर स्पष्ट नहीं हो पा रहा था। शायद अगर मैं इस पर हाजिर नहीं होता तो यह एक प्रश्न की तरह दिखता है :)। तथ्य यह है कि मुझे ऐसे कई संसाधन नहीं मिले जो एनीमेशन स्टेट्स से निपटते हैं और जिन लोगों ने इसे कठिन-कोडित किया है, इसलिए सामग्री बनाना / बदलना एक बुरा सपना होगा। तो मेरा सवाल है: क्या यह दृष्टिकोण सही है या नहीं? और अगर आप लोग कहते हैं कि यह है, तो यह ठीक है :)।
user8363

जवाबों:


4

एनीमेशन क्लिप को सादे-पुराने-डेटा में सबसे अच्छा वर्णित किया गया है, जैसा कि आपने अपने पहले XML स्निपेट में किया है। आप इसे हाथ से बना सकते हैं, या इसे कला पैकेज से निर्यात कर सकते हैं। किसी भी तरह से, आप शायद एक ऐसी पाइपलाइन बनाना चाहते हैं जो इसे एक्सएमएल जैसे मानव-पठनीय मध्यवर्ती प्रारूप से लेती है और इसे किसी ऐसी चीज में डालती है जो अच्छी और जल्दी लोड होती है।

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

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

सरल गेम आइटम (मूल पृष्ठभूमि रंगमंच की सामग्री और पसंद) के लिए एक एनिमेटेट घटक पर्याप्त है, लेकिन अधिक जटिल संस्थाओं के लिए आप इसे मांगने के लिए एक राज्य मशीन का उपयोग करना चाहते हैं। यह लू या पाइथन जैसी स्क्रिप्टिंग भाषा में सबसे अच्छा व्यक्त किया गया है। एक राज्य में कई कार्यात्मक ब्लॉक हो सकते हैं (onEnter, onExit, onUpdate, onEvent), साथ ही साथ एक समयरेखा जो कुछ कार्यों को निर्दिष्ट करती है और ट्रिगर होती है जो निश्चित समय पर होनी चाहिए। आपके पास शायद कुछ प्रकार के प्रबंधक वर्ग होंगे जो इन राज्य मशीनों को उचित रूप में अपडेट करने के लिए जिम्मेदार हैं, साथ ही साथ वे होने पर समयरेखा कॉलबैक को ट्रिगर करते हैं। आपको इन चीजों को जितना संभव हो उतना इवेंट-आधारित रखने की कोशिश करनी चाहिए, क्योंकि आपके द्वारा लिखे गए प्रत्येक ऑनउपडेट को इकाई गणना के साथ एक रैखिक लागत होगी। आप टैग निर्दिष्ट करने में सक्षम होना चाहते हैं ('हमला', 'बेकार'), 'आग्नेयंत्र', आदि) जो पूरे राज्यों और राज्यों के निश्चित समय क्षेत्रों से जुड़े हैं। आप शायद कुछ उच्च-स्तरीय ईवेंट हैंडलर भी चाहते हैं जो पूरे राज्य-ग्राफ़ पर लागू होते हैं, न कि केवल एक विशेष स्थिति में।

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


1

सबसे अच्छा डेटा-चालित एनीमेशन सिस्टम जो मैंने अब तक देखा है वह ब्लेंड ट्री है । वास्तव में, यह बहुत अच्छा है और यह सब आप यहाँ माँग रहे हैं। AIGameDev.com के अनुसार यह अब उद्योग में वास्तविक मानक है, और मेरा मानना ​​है कि वे सही हैं।

दुर्भाग्य से मैं एक त्वरित Googling के साथ कोई अच्छा संसाधन पाया है, लेकिन आप कोशिश कर सकते हैं इस या कि एक सिंहावलोकन मिलता है। AIGameDev.com पर एक भुगतान लेख भी है , यह नहीं जानते कि क्या यह प्रीमियम खाता पाने लायक है।


यह एक बहुत अच्छा संसाधन है, धन्यवाद। मैं इस तरह की जानकारी के लिए देख रहा हूँ।
user8363

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