गेम में टाइम स्टॉप या बुलेट टाइम को कैसे कोड करें?


11

मैं XNA 4.0 में एकल-खिलाड़ी आरपीजी प्लेटफ़ॉर्मर विकसित कर रहा हूं। मैं एक ऐसी क्षमता जोड़ना चाहूंगा, जो समय को "रोक" या धीमा कर दे, और मूल गति पर केवल खिलाड़ी के चरित्र को स्थानांतरित करें (बाल्डूर के गेट श्रृंखला से टाइम स्टॉप जादू के समान)। मैं एक सटीक कार्यान्वयन की तलाश नहीं कर रहा हूं, बल्कि कुछ सामान्य विचार और डिजाइन-पैटर्न।

संपादित करें: सभी महान इनपुट के लिए धन्यवाद। मैं निम्नलिखित समाधान के साथ आया हूं

    public void Update(GameTime gameTime)
        {

            GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
 new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
            gameTime = newGameTime;

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

जवाबों:


8

यह एक बुरा समाधान हो सकता है, लेकिन जरूरी नहीं। यदि आप डेल्टा समय का उपयोग कर रहे हैं, तो आप कुछ चीजों की गति को बदल सकते हैं।

उदाहरण के लिए:

player.update(dt)
dt = dt * .5 --half speed
enemy.update(dt)

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

x = x + xspeed * dt * speed

पहला भाग सही समझ में आता है, दूसरा भाग स्पष्ट नहीं है
AturSams

2
बस एक गति चर को स्थानांतरित करने वाली प्रत्येक वस्तु दें, जिसे आप बदल सकते हैं, और जब आपके पास परिवर्तन होता है (उदाहरण के लिए x), तो गति चर द्वारा परिमाण को गुणा करें।
tesselode

अब समझ में आता है। :)
AturSams

दूसरा विचार लगता है ... बंद। बस "गति" कारक द्वारा आंदोलन को स्केल करना भौतिकी संचालित वस्तुओं के लिए काम कर सकता है, लेकिन एआई सामान्य गति पर प्रतिक्रिया करने में सक्षम होगा, केवल उनके आंदोलन धीमा / बिगड़ा हुआ है।

आपका क्या मतलब है कि AI सामान्य गति से प्रतिक्रिया कर पाएगा? AI में ऐसा कौन सा कोड होगा जो स्पीड वैरिएबल लागू नहीं कर सकता है?
टेसलोड

3

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

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

जब धीमा प्रभाव बंद हो जाता है, तब भी घड़ियों का उपयोग किया जाता है और उस समय के 100% की वृद्धि होती है जो वास्तव में पारित हो जाती है।

यह भी जल्दबाजी में काम आ सकता है।

@ सिदार: मुझे दो विकल्प मिलते हैं,

  1. प्रति प्राणी आंतरिक घड़ी। यह पता लगाने के लिए कि क्या प्राणी फिर से हमला करने के लिए तैयार है: पिछली बार बचाने के लिए प्रत्येक हमले का उपयोग किया गया था + रिचार्ज समय और जांचें कि क्या आंतरिक घड़ी उस समय पहले से ही पारित हो चुकी है।

  2. प्रति आक्रमण एक टाइमर: आप जानते हैं कि रिचार्ज करने में कितना समय लगता है और आप बस एक टाइमर सेट करते हैं और प्रत्येक बारी में * (1-मंदी%) बीतने वाले समय को घटाते हैं।

मैं व्यक्तिगत रूप से प्रसंस्करण समय और जटिलता को बचाने के लिए कई व्यक्तिगत टाइमर और उपयोगकर्ता एक आंतरिक घड़ी को घटाने से बचना पसंद करता हूं।

यह वास्तव में वरीयता पर निर्भर है (यह प्रदर्शन को प्रभावित नहीं करता है)।


आंतरिक घड़ियों की आवश्यकता नहीं है। यह बस एक गुणक के लिए नीचे आता है जिसे आप (किसी में) अपनी वस्तु से लिंक कर सकते हैं जो या तो आपके dt (डेल्टा समय) के उत्पाद को बढ़ाता है या घटाता है। आप समूहों या किसी भी माध्यम से वस्तुओं का प्रबंधन कर सकते हैं। मुझे लगता है कि आपका रास्ता थोड़ा ज्यादा हो सकता है। लेकिन अरे अगर यह काम करता है ... तो यह काम करता है।
सिदार

@Sidar यदि आप इससे बचते हैं, तो आपको समय-समय पर रीचार्ज, स्पेल की अवधि और इस तरह की चीजों पर हमला करने की आवश्यकता होगी। कम से कम इस तरह से आपको केवल एक घड़ी को अपडेट करने की आवश्यकता है और गुणों के रीसेट के लिए बस 'अंतिम सक्रियण' समय रखें।
AturSams

हालांकि उनका सवाल खिलाड़ी को छोड़कर पर्यावरण को धीमा करने से संबंधित है। मेरे लिए यह सबसे सरल रूप की तरह लग रहा है जैसे कि dt को 1 से कम संख्या के साथ गुणा करना। जबकि यह खिलाड़ी के लिए है।
सिडार

खैर, वातावरण को धीमा करने में उनकी हमले की दर के साथ-साथ उनकी अन्य क्षमताओं को धीमा करना भी शामिल है (क्योंकि यह एक आरपीजी है), विभिन्न भीड़ क्षमताएं हो सकती हैं जो रिचार्ज समय पर निर्भर करती हैं। हील्स, बफ्स, डेबफ, मंत्र और आदि सक्रियण समय का उल्लेख नहीं करने के लिए।
AturSams

2

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

मेरा सुझाव है कि आप एक घड़ी पदानुक्रम लागू करें :

.
├── Main clock
│   └── UI clock
│   └── 3D clock
│       ├── GFX clock
│       └── Gameplay clock
│           └── Slowdown spell clock 01
│           └── Slowdown spell clock 02

आपके खेल में हर चीज को घड़ी में से एक से डेल्टा बार का उपयोग करना चाहिए: ग्राफिक्स प्रभाव GFX घड़ी पर चलता है, AI & एनीमेशन गेमप्ले घड़ी पर चलता है, एक धीमी गति से चलने वाले स्पेल क्लॉक घड़ी आदि पर चलने वाले जीवों से प्रभावित होते हैं, फिर विभिन्न चीजें। अपनी पदानुक्रम के विभिन्न हिस्सों को प्रभावित करते हैं: एक मंदी की घड़ी एक कस्टम घड़ी बनाती है और प्रभावित करती है, जबकि एक बुलेट समय पूरे 3 डी घड़ी पदानुक्रम को प्रभावित करेगा।


धन्यवाद, यह एक महत्वपूर्ण अंतर्दृष्टि है। हालांकि, मुझे लगता है कि मैं सोचता हूं कि यह सरल होगा, क्योंकि यह मेरे विशेष मामले में समझ में नहीं आता है कि एक ही समय में कई मंदी प्रभाव होंगे।
डेविड मिलर

1

आपको केवल एक के बजाय दो अलग-अलग घड़ियों की आवश्यकता है, एक गेमप्ले के लिए प्रासंगिक समय और एक "सही" समय के लिए।

currentGameTime = 0;
gameSpeed = 1.0f;
[...]
currentApplicationTime = GetTime():
timeDelta = (currentApplicationTime - lastApplicationTime)*gameSpeed;
currentGameTime += timeDelta;
lastApplicationTime = currentApplicationTime;

फिर आप बस गेम स्पीड को बदल सकते हैं (> 1) या समय को धीमा कर सकते हैं (<1)। खिलाड़ी के लिए अलग-अलग गति से आगे बढ़ने के लिए बस व्हीटर की जांच करें कि समय धीमा है या नहीं।

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