2010-02-04 29 views
5

मुझे समझ में आता है कि ऐसा क्यों करता है लेकिन मुझे वास्तव में यह नहीं पता कि इसे कैसे रोकें। तो परिदृश्य यह है कि, हर फ्रेम मैं पूर्व निर्धारित पिक्सल के द्वारा कार को स्थानांतरित करता हूं। क्या होता है जब मैं धीमी या तेज़ कंप्यूटर पर जाता हूं ... अच्छी तरह से मुझे प्रति सेकंड कम या अधिक फ्रेम मिलते हैं ताकि कार धीमी या तेज हो। मैं सोच रहा था कि मैं इसे कैसे रोक सकता था।रेस कार गेम, कार तेजी से कंप्यूटर पर तेजी से बढ़ रही है

मुझे संदेह है कि मुझे किसी भी पुस्तकालय का उपयोग करने में एक ही समस्या होगी ... यह मेरी पहली बार वास्तविक समय की चीजें कर रहा है।

+8

टर्बो बटन दबाएं! –

+0

http://stackoverflow.com/questions/622604/best-approach-for-game-animation – Macke

उत्तर

12

मैं अपने वर्तमान कोड इस

// to be called every frame 
void OnEveryFrame() 
{ 
    MoveCar(); 
    DrawCarToScreen(); 
} 

की तरह किसी भी तरह लग रहा है पर शक लेकिन यह इस तरह होना चाहिए:

// to be called - for example - 50 times per second: 
void OnEveryTimerEvent() 
{ 
    MoveCar(); 
} 

// to be called every frame 
void OnEveryFrame() 
{ 
    LockTimerEvents(); 
    DrawCarToScreen(); 
    UnlockAndProcessOutstandingTimerEvents(); 
} 

आप निश्चित रूप से, एक टाइमर अनुसार घटना की स्थापना करना है।

10

टाइमर के अनुसार कार ले जाएं और फ़्रेमेट न करें। यानी कार मॉडल प्रदर्शन प्रतिनिधित्व से स्वतंत्र होना चाहिए।

+0

की संभावित डुप्ली क्या टाइमर सही ढंग से समझने पर प्रत्येक फ्रेम के बीच के समय की गणना करेगा? – DogDog

+0

@ एपोक, हाँ। यदि आप framerate – Polaris878

0

आपको कार और चित्रों को स्थानांतरित करने से पहले समय बचाने के लिए है।
सभी गणनाओं के बाद समय बचाएं।
अपनी कार को एनपीक्सल्स/सेकंड

2

आंदोलन को "वास्तविक" समय विलंब से बाधित किया जाना चाहिए, यानी आप कार x पिक्सेल प्रति बार स्लाइस की गति से आगे बढ़ेंगी।

2

रीयल-टाइम घड़ी पढ़ें, और कार को विलुप्त समय के लिए उचित दूरी पर ले जाएं। यदि कंप्यूटर बहुत धीमा है, तो यह कुछ हद तक "झटकेदार" लग सकता है, लेकिन सीपीयू की गति से कार की गति स्वतंत्र हो जाती है।

3

आप सटीक टाइमर और वेक्टर गणित का उपयोग कर इसे हल कर सकते हैं।

तो, तर्क के लिए सुझाव देते हैं कि आपके ड्राइंग कोड को किसी भी समय समय पर बुलाया जा सके, उदा। 1 सेकंड अलग या 3 सेकंड अलग या 0.02 सेकंड अलग।

कार आंदोलन की गति को 40 पिक्सेल प्रति सेकेंड ले जाएं।

इसलिए, पिक्सेल की संख्या को स्थानांतरित करना चाहिए (TIME_NOW - LAST_FRAME_TIME) * 40px।

2

आपको फ्रेमरेट को प्रति सेकंड एक्स फ्रेम (60 एफपीएस सबसे आम) पर टोपी करने की आवश्यकता है। एसएफएमएल सहित अधिकांश मल्टीमीडिया ढांचे में यह एक आम विशेषता है। एसएफएमएल के लिए मैं विंडो/रेंडरविंडो विधि SetFramerateLimit(unsigned int Limit) में देखता हूं।

+0

की बजाय समय के आधार पर जाते हैं तो आपके पास एक और अधिक संगत गेम होगा जो फ्रेम दर 60 के नीचे होने पर समस्या को ठीक नहीं करता है। – DogDog

1

आपको fix your timestep की आवश्यकता है। असल में, आप जिस फ्रेम को कार को एक दूरी पर ले जाते हैं, वह इस बात पर निर्भर करता है कि आखिरी अपडेट कॉल के बाद वास्तव में कितना समय बीत चुका है। इस तरह, आप फ्रेमरेट की परवाह किए बिना सही गति प्राप्त करते हैं।

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