फायरिंग एनीमेशन के साथ बुलेट रिलीज कैसे टाई


15

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

संपादित करें: मुझे लगता है कि मुझे सवाल ठीक से बोलने में परेशानी हो रही है।

मेरा प्रश्न


धन्यवाद! आप सभी से कई अच्छे विचार, मुझे कॉलबैक का उपयोग करने का विचार पसंद है। मुझे लगता है कि मैं कोशिश करूँगा और उस पर अमल करूँगा, मैं वास्तव में समय की ट्रैकिंग पर भरोसा नहीं करना चाहता था।
tp0w3rn 30

जवाबों:


8

मौलिक रूप से आप सही रास्ते पर हैं - आपको यह जानने की आवश्यकता है कि इस तरह की चीज करने के लिए एनीमेशन कितने समय तक रहता है। एनिमेशन केवल फ़्रेमों के संग्रह से अधिक हैं, उनके आसपास अन्य प्रकार की अन्य जानकारी है जो आपको चाहिए। उदाहरण के लिए कितने फ्रेम हैं, एनीमेशन लूप करता है, कितनी जल्दी यह वापस खेलता है (जैसे 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 पर हूं, इसका मतलब है कि "आग" नामक यह घटना अभी हुई है, इसे जोड़ें हाल की घटनाओं की मेरी सूची ताकि मैं इसके बारे में पूछने वाले किसी को भी बता सकूं। '

यदि आपको एनीमेशन के भीतर होने वाली बुलेट फायरिंग की आवश्यकता नहीं है, लेकिन केवल एक बार यह समाप्त हो गया है, तो आप घटनाओं की धारणा के बिना बहुत कम जटिल प्रणाली से दूर हो सकते हैं। लेकिन आप अभी भी एक ऐसी प्रणाली चाहते हैं जहाँ एनिमेशन अपने आप वापस आ जाएँ, पता है कि वे कितने लंबे समय तक हैं, और एनीमेशन पूरा होने पर गेम कोड पर वापस कॉल कर सकते हैं।


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

एनिमेशन को टुकड़ों में विभाजित करना बहुत अनावश्यक लगता है। मैं एनीमेशन की स्थिति के लिए मतदान नहीं करने से सहमत हूं, लेकिन यह अभी भी अपनी पहली सिफारिश छोड़ देता है। मुझे नहीं पता कि क्या उनका मतलब बाकी गेम (ऑब्जर्वर पैटर्न?) से एनीमेशन कोड को अलग करने के लिए एक अलग ईवेंट सिस्टम है, लेकिन मैं इसे कैसे करूंगा। न तो "लॉजिक्स" जैसा कि आपने इसे एनीमेशन कोड के बारे में जानना चाहिए, या इसके विपरीत।
झॉकिंग

@ कोयोट मैं कहूंगा कि आप दो अलग-अलग चीजों को मिला रहे हैं। हां, सर्वर साइड लॉजिक हमेशा विजुअल्स से स्वतंत्र होना चाहिए (क्योंकि आप नहीं चाहते हैं कि एनीमेशन सिस्टम को चलाने के लिए बस यह पता लगाना है कि कब गोली चलाई जाए), लेकिन यह आपको क्लाइंट पर एनीमेशन सिस्टम बनाने में मदद नहीं करेगा। । क्लाइंट पर, आप बिल्कुल नहीं चाहते कि विज़ुअल को सर्वर पर माइंडलेस तरीके से स्लेव किया जाए, क्योंकि यह बहुत ही भयानक लगेगा - विषम समय पर दिखने वाली गोलियां और कैरेक्टर के साथ सिंक से बाहर क्योंकि गेम और सर्वर के बीच लैग स्पाइक था । ऐसा कोई कारण नहीं है कि आप दोनों (cont ...)
MrCranky

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

@ कोयोट वास्तव में अब मैं इसके बारे में सोचता हूं, बुलेट फायरिंग इसके लिए एक भयानक उदाहरण है, ज्यादातर इसका कारण नीचे के थैडियन से है। फायरिंग सीधे होनी चाहिए। एक बेहतर उदाहरण एक धूल वीएफएक्स फायरिंग होगी जब एक चरित्र भूमि - सर्वर और क्लाइंट के रूप में सिंक होता है जब चरित्र कूदना शुरू होता है, लेकिन दृश्य प्रदर्शन क्लाइंट तक छोड़ दिया जाता है। और जब एनीमेशन सही फ्रेम से टकराता है, जहां पैर जमीन से टकराता है, तो वीएफएक्स इवेंट में आग लगनी चाहिए। इसी तरह, घटनाओं की आवश्यकता होती है यदि एक निश्चित एनीमेशन फ्रेम पर निर्णय लेने की आवश्यकता होती है, चाहे दूसरे एनीमेशन पर शाखा हो।
MrCranky

3

किसी तरह से, आपको एनीमेशन के पूरा होने तक इंतजार करना होगा और उस बिंदु पर बुलेट बनाना होगा।

बस एक टाइमर सेट करना काम करेगा, यदि आप सुनिश्चित हैं कि आपकी एनीमेशन दर तय हो गई है। मामूली बदलाव के रूप में, आपके पास बुलेट को आंतरिक कोड हो सकता है जो प्रदर्शित होने और आगे बढ़ने से पहले एक पल के लिए अदृश्य रूप से प्रतीक्षा करता है।

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


1
फ्लिक्सल की addAnimationCallbackविधि का उपयोग फायरिंग इकाई पर किया जा सकता है। कॉलबैक फ़ंक्शन में, आप देख सकते हैं कि फायरिंग एनीमेशन का वर्तमान फ्रेम वह फ्रेम है जिसे बुलेट इकाई बनाना चाहिए। अगर ऐसा है तो आप स्क्रीन पर बुलेट जोड़ सकते हैं।
स्नो ब्लाइंड

2

सीधे आगे का जवाब: मान लें कि आपके पास एक ऐसा एनीमेशन है जिसे आप तब खेलना चाहते हैं जब खिलाड़ी 'फायर' बटन दबाता है, और खेलने के बाद एक गोली निकलती है। आदर्श रूप से, आपको एनीमेशन समय के हार्ड-कोडिंग से बचना चाहिए, और जब एनीमेशन पूरा हो जाए (तब आपके प्लेटफ़ॉर्म पर निर्भर करता है) मैं ऐसा करने के लिए किसी अन्य विधि के बारे में नहीं सोच सकता जो अत्यधिक जटिल नहीं है।

वैकल्पिक गेम डिज़ाइन उत्तर: जब तक ऐसा करने के लिए वास्तव में अच्छा कारण नहीं है, मैं 'फायर' बटन को दबाने और बुलेट दिखाई देने में देरी से बचना चाहूंगा। जब तक एनीमेशन वास्तव में नहीं है, वास्तव में छोटा (एक या दो फ्रेम, अधिकतम, मूल रूप से एक थूथन फ्लैश), यह फायर बटन प्रतिक्रिया को धीमा महसूस करने जा रहा है, और यह सिर्फ एक विशिष्ट खिलाड़ी को परेशान करेगा। यहां तक ​​कि अगर आप गोलियों से बाहर आने से पहले एक एनीमेशन का उपयोग करने के साथ जाने का फैसला करते हैं (बारी आधारित आरपीजी और सामरिक खेल ऐसा करने के लिए स्वीकार्य कारण होंगे), तो मुझे लगता है कि "बारी बारी से एनिमेशन" विकल्प को शामिल करने के बारे में, कहीं अनुमति देने के लिए खेल तेजी से आगे बढ़ना है अगर खिलाड़ी चाहता है।


हाँ, धीरे-धीरे आग की प्रतिक्रिया न करें। यह कूदने के साथ आम मुद्दे की तरह है; एनिमेटर एक बड़ा विंडअप बनाते हैं, लेकिन बटन टैप करते ही खिलाड़ियों के एयरबोर्न होने की उम्मीद होती है।
झॉकिंग

2

जैसा कि मि। क्रैंकी कहते हैं; एनीमेशन और लॉजिक्स को अलग रखें।

लेकिन सबसे महत्वपूर्ण बात, लॉजिक्स को मास्टर हिस्सा बने रहना चाहिए

  • जब फायर बटन दबाया जाता है तो आपको अपने चरित्र की स्थिति (लॉजिक्स) में ड्रॉ " एक्शन " को ट्रिगर करना चाहिए ।
  • इस कार्रवाई को सभी मानकों (समय आदि के लिए) के साथ ड्राइंग एनीमेशन को ट्रिगर करना चाहिए ।
  • एक बार ड्रा एक्शन समाप्त होने के बाद आप फायर एक्शन को ट्रिगर कर सकते हैं (हथियार के आधार पर एक या अधिक बार फायर कर सकते हैं)
  • यह क्रिया गोलियों को उत्पन्न कर सकती है और आग एनीमेशन को ट्रिगर कर सकती है ।

ध्यान रखें कि लॉजिक्स से यूआई को नियंत्रित करना एकमात्र तरीका है जिससे आप यह सुनिश्चित कर पाएंगे कि आप अपने लॉगिक्स को बाद में (नए रेंडरर, नए गेम, सर्वर वर्जन को रेंडरर के बिना ...) रख सकें, पुनः उपयोग कर सकें और साझा कर सकें।


1

सबसे पहले, मैं कोड के टुकड़ों को अपघटित करने के लिए एक इवेंट सिस्टम (ऑब्जर्वर पैटर्न?) का उपयोग करूँगा। यह सिर्फ एनीमेशन के लिए नहीं है, लेकिन निश्चित रूप से वहां लागू होता है। तब एनीमेशन कोड बस डिस्पैचवेंट (ईवेंट) कह सकता है और कोड का कुछ अन्य भाग उस घटना के लिए सुनता है, बिना कोड के किसी भी हिस्से को एक दूसरे के बारे में जानने की आवश्यकता नहीं है।

अब एनीमेशन कोड को वास्तव में इवेंट डिस्पैचर (आसानी से निर्भरता इंजेक्शन के साथ किया गया) का संदर्भ है और आपको कुछ XML या JSON की आवश्यकता है जो वास्तव में आपके एनिमेशन को परिभाषित करता है। कुछ इस तरह:

{
  animation: {
    name: shoot,
    length: 12,
    spritesheet: shoot.png
    event: {
      frame: 4,
      name: bulletLeavesGun,
    },
  },
}

एनीमेशन लोड करते समय डेटा में पढ़ें, और एनीमेशन कोड घटना को उस समय प्रेषण करें जब यह प्लेबैक के दौरान उस फ्रेम पर हो।

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