2016-07-06 10 views
6

प्रश्न: SKScene में update(currentTime:) समारोह एक currentTime तर्क के साथ हर फ्रेम कहा जाता है। मैं सोच रहा हूं कि उसी स्रोत से समय कैसे प्राप्त करें update(currentTime:)update फ़ंक्शन का उपयोग किए बिना उपयोग करता है। मुझे केवल CFAbsoluteTimeGetCurrent() मिला जो अलग है।एक ही समय में अपडेट कैसे करें (currentTime :) फ़ंक्शन का उपयोग करता है? (पहले यह कहा जाता है)

कारण: timeSinceLastUpdate की गणना करने के लिए आपको timeOfLastUpdate नामक एक इंस्टेंस वैरिएबल की आवश्यकता है। timeOfLastUpdate को लागू करने के लिए आपको पहले अपडेट से पहले मनमाना मूल्य पर सेट करने की आवश्यकता है जो timeSinceLastUpdate की पहली गणना गलत बनाता है। अगर बयान इस का पता लगाने या optionals का उपयोग लेकिन यह एक अनावश्यक शाखा है जो करता है, तो मैं सिर्फ didMoveToView(view:) में timeOfLastUpdate सेट से बचा जा सकता है करने के लिए आप एक सरल हो सकता था। और यही वह है जो मैं करने की कोशिश कर रहा हूं।

+0

मैंने देखा है कि 'currentTime' डिवाइस को चलने वाले सेकंड में समय देता है, जिसका अर्थ यह है कि हर बार जब आप रीबूट करते हैं तो इसे रीसेट किया जाता है। इस मूल्य को पाने के तरीके हैं, लेकिन आप जो कर रहे हैं उसके लिए, रिकस्टर का जवाब जाने का तरीका है। – mogelbuster

उत्तर

4

पहले timeSinceLastUpdate हमेशा बाकी से अलग हो जाएगा। आम तौर पर एक पिछले update कॉल से पूर्ण समय संग्रहीत करता है और एक timeSinceLastUpdate प्राप्त करने के लिए वर्तमान कॉल के समय से यह घटा देती है। यदि पिछला समय मौजूद नहीं है क्योंकि आप रेंडर लूप के माध्यम से पहले पास पर हैं - यह शून्य या अनंत या नकारात्मक कुछ पर सेट है या जो भी सेंडिनल मान आपने आरंभ किया है, बस अपना timeSinceLastUpdate प्रारंभ करने के लिए कुछ मामूली मूल्य पर सेट करें । आपके फ्रेम अंतराल की तरह कुछ (16.67 एमएस यदि आप 60 एफपीएस के लिए जा रहे हैं) समझ में आएगा - आप खेल कोड नहीं चाहते हैं जो उस समय अंतराल पर कुछ जंगली करने के लिए निर्भर करता है क्योंकि आपने इसे शून्य या कुछ जंगली रूप से भारी मूल्य पारित किया है।

वास्तव में, यह आपके खराब होने के कारण timeSinceLastUpdate को सामान्य रूप से फैन करने के लिए तर्क देने का कोई बुरा विचार नहीं है, क्योंकि आपके उपयोगकर्ता ने गेम को रोक दिया और फिर से शुरू किया। यदि आपके पास गेम इकाइयां हैं (जैसे गेमप्लेकिट एजेंट) जिनके आंदोलन position += velocity * timeSinceLastUpdate मॉडल के किसी प्रकार का अनुसरण करते हैं, तो आप उन्हें एक फ्रेम के बराबर समय से आगे बढ़ना चाहते हैं, जब आप एक विराम से फिर से शुरू करते हैं, पांच मिनट के विराम समय वेग नहीं लेते हैं और कूदते हैं hyperspace।

यदि आप अपने पिछले समय को शून्य, घटाएं, और अपने अपेक्षित फ्रेम अंतराल को सामान्यीकृत करते हैं, तो आप एक ही कोड के साथ प्रारंभिक और रोकथाम दोनों मामलों को कवर करेंगे।

+0

मैं सोच रहा हूं कि 'didMoveToView' विधि से "पिछला" समय कैसे प्राप्त करें। चूंकि वर्तमान समाधान के लिए एक बूलियन अभिव्यक्ति ~ 60 बार प्रति सेकेंड का मूल्यांकन करने की आवश्यकता होती है, भले ही इसे पहले अपडेट में केवल एक बार जरूरी हो। – Mazen

+1

जैसा कि मैंने नोट किया है, कि बूलियन चेक केवल पहले अपडेट की तुलना में अधिक उपयोगी/आवश्यक है। और यह आपके अपडेट विधि में हर चीज की तुलना में हजारों गुना तेज है - जो मुझे मिल रहा है वह यह है कि एक कल्पित "पिछला" समय आविष्कार करने का प्रयास करने के लिए बस उस चेक को अनुकूलित करने के लिए चीजों को खत्म करना है। – rickster

2

तुम हमेशा सम्मिलित इस्तेमाल कर सकते हैं:

let deltaTime = currentTime - (previousTime ?? currentTime). 

पहले लूप पर, अपने deltaTime 0 है (यह होना चाहिए) उसके बाद, यह परिवर्तन

पाठ्यक्रम previousTime का है इस के लिए एक वैकल्पिक होना चाहिए काम करने के लिए

संबंधित मुद्दे