मौलिक रूप से आप सही रास्ते पर हैं - आपको यह जानने की आवश्यकता है कि इस तरह की चीज करने के लिए एनीमेशन कितने समय तक रहता है। एनिमेशन केवल फ़्रेमों के संग्रह से अधिक हैं, उनके आसपास अन्य प्रकार की अन्य जानकारी है जो आपको चाहिए। उदाहरण के लिए कितने फ्रेम हैं, एनीमेशन लूप करता है, कितनी जल्दी यह वापस खेलता है (जैसे 10 एनीमेशन फ्रेम प्रति सेकंड या 25, या 60?)। प्रत्येक एनीमेशन को डेटा के कुछ टुकड़ों के संदर्भ में परिभाषित किया जा सकता है, जिसे कुछ सामान्यीकृत एनीमेशन कोड देख सकते हैं और वापस खेल सकते हैं। आपको अपने स्वयं के कोड में एनीमेशन भाग को इनकैप्सुलेट करना चाहिए, जो इन एनीमेशन परिभाषाओं के अलावा और व्यक्तिगत छवि फ़्रेमों को प्रदर्शित करने के लिए कुछ भी नहीं पता है। यही है, एक एनीमेशन ऑब्जेक्ट है जिसे आप लोड कर सकते हैं, खेलना शुरू कर सकते हैं, खेलना बंद कर सकते हैं और स्क्रीन पर किसी विशेष स्थान पर रेंडर कर सकते हैं।
इस तरह की जानकारी को एनकैप्सुलेट करने के लिए एक लचीली एप्रोच का उपयोग एनीमेशन परिभाषा की तरह किया जाता है। इसलिए केवल कहने के बजाय "एनीमेशन एक्स इन सभी फ़्रेमों का है, बस उनके माध्यम से खेलें", आपको कुछ अधिक जटिल लगता है।
उदाहरण के लिए किसी प्रकार के डेटा प्रारूप का मजाक उड़ाया गया
एनिमेशन =
{
{name = "walk", files = "walk * .png", फ्रेमवर्क = "12", लूप = "सही"},
{name = "फायर" फाइलें = "फायर * .पीएनजी" फ्रेमकाउंट = "6",
घटनाएँ = {
{name = "बुलेटलेव्सगुन", फ्रेम = "४", परम १ = "४३", परम २ = ३० "}
}
}
}
तो आपका कोड कुछ ऐसा कहता है:
currentAnimation = animations.Get("fire");
currentAnimation.Play();
आप घटनाओं का पता कैसे लगा सकते हैं या तो आपको वापस बुलाए जाने वाले एनीमेशन कोड के साथ हो सकता है (यानी जब यह एक नई घटना का पता लगाता है क्योंकि एनीमेशन एक निश्चित फ्रेम में खेला गया है, तो यह आपके गेम कोड को नई घटना के बारे में बताने के लिए कहता है), या मतदान द्वारा एनीमेशन इस तरह:
List<Event> events = currentAnimation.EventsSinceLastCheck();
foreach (AnimationEvent event in events)
{
if (event.name == "bulletLeavesGun")
{
Vector2 bulletPosition = new Vector2(event.param1, event.param2);
Vector2 actualBulletPosition = new Vector2(
character.x + bulletPosition.x,
character.y + bulletPosition.y);
CreateBulletAt(actualBulletPosition);
}
}
नोट करने के लिए अंक:
- एनीमेशन कोड गेम कोड से अलग से मौजूद होना चाहिए। आप वास्तव में अपने गेमप्ले कोड को बहुत अधिक कसकर एनीमेशन प्लेबैक के नट और बोल्ट से बांधना नहीं चाहते हैं।
- एनीमेशन कोड जानता है कि एनीमेशन परिभाषा के आधार पर लूप करना है या नहीं
- एनीमेशन कोड जानता है कि एनीमेशन कब किया जाता है, और किसी अन्य कोड को वापस कहने के लिए कह सकते हैं 'हे, एनीमेशन को "फायर" कहा जाता है बस समाप्त हो गया, अब आप क्या करना चाहते हैं?'
- एनीमेशन कोड के अलावा अन्य घटनाओं के बारे में कुछ भी नहीं पता है कि उनके पास एक नाम है और उनके साथ जुड़े कुछ मनमाना डेटा (param1 और param2)
- एनीमेशन कोड जानता है कि यह वर्तमान में किस फ्रेम पर है, और जब यह एक नए फ्रेम में बदलता है, तो यह जांच कर सकता है और कह सकता है कि ओह, मैं अभी फ्रेम 4 पर हूं, इसका मतलब है कि "आग" नामक यह घटना अभी हुई है, इसे जोड़ें हाल की घटनाओं की मेरी सूची ताकि मैं इसके बारे में पूछने वाले किसी को भी बता सकूं। '
यदि आपको एनीमेशन के भीतर होने वाली बुलेट फायरिंग की आवश्यकता नहीं है, लेकिन केवल एक बार यह समाप्त हो गया है, तो आप घटनाओं की धारणा के बिना बहुत कम जटिल प्रणाली से दूर हो सकते हैं। लेकिन आप अभी भी एक ऐसी प्रणाली चाहते हैं जहाँ एनिमेशन अपने आप वापस आ जाएँ, पता है कि वे कितने लंबे समय तक हैं, और एनीमेशन पूरा होने पर गेम कोड पर वापस कॉल कर सकते हैं।