मैंने आंदोलन पर दो अन्य सूत्र यहां पढ़े हैं: समय आधारित आंदोलन बनाम फ्रेम दर आधारित आंदोलन? , और मुझे एक निश्चित या चर समय चरण का उपयोग कब करना चाहिए?
लेकिन मुझे लगता है कि मुझे फ्रेम इंडिपेंडेंट मूवमेंट की बुनियादी समझ की कमी है क्योंकि मुझे समझ नहीं आ रहा है कि दोनों में से कौन सा सूत्र बात कर रहा है।
मैं आलसी के एसडीएल ट्यूटोरियल के साथ अनुसरण कर रहा हूं और स्वतंत्र पाठ के फ्रेम पर आया हूं। http://lazyfoo.net/SDL_tutorials/lesson32/index.php
मुझे यकीन नहीं है कि कोड का आंदोलन भाग क्या कहने की कोशिश कर रहा है, लेकिन मुझे लगता है कि यह यह है (कृपया मुझे सही करें अगर मैं गलत हूं): स्वतंत्र आंदोलन को फ्रेम करने के लिए, हमें यह पता लगाना होगा कि कोई वस्तु कितनी दूर है ( उदा। स्प्राइट) एक निश्चित समय सीमा के भीतर चलता है, उदाहरण के लिए 1 सेकंड। यदि डॉट 200 पिक्सेल प्रति सेकंड की गति से चलती है, तो मुझे यह गणना करने की आवश्यकता है कि यह 200 सेकंड में गुणा करके उस सेकंड के 1/1000 से कितने गुणा बढ़ जाता है।
क्या वह सही है? सबक कहता है:
"सेकंड में अंतिम फ्रेम के बाद से पिक्सेल प्रति सेकंड * समय में वेग। इसलिए यदि कार्यक्रम 200 फ्रेम प्रति सेकंड पर चलता है: 200 pps * 1/200 सेकंड = 1 पिक्सेल"
लेकिन ... मुझे लगा कि हम एक सेकंड के 1/1000 वें द्वारा 200 pps गुणा कर रहे हैं। प्रति सेकंड फ़्रेम के साथ यह व्यवसाय क्या है?
मैं सराहना करता हूँ अगर कोई मुझे थोड़ा और विस्तृत विवरण दे सकता है कि स्वतंत्र आंदोलन कैसे काम करता है।
धन्यवाद।
अलावा:
SDL_Rect posRect;
posRect.x = 0;
posRect.y = 0;
float y, yVel;
y = 0;
yVel = 0;
Uint32 startTicks = SDL_GetTicks();
bool quit = false;
SDL_Event gEvent;
while ( quit == false )
{
while ( SDL_PollEvent( &gEvent ) )
{
if ( gEvent.type == SDL_QUIT )
quit = true;
}
if ( y <= 580 )
{
yVel += DOT_VEL;
y += (yVel * (SDL_GetTicks() - startTicks)/1000.f);
posRect.y = (int)y;
}
startTicks = SDL_GetTicks();
SDL_BlitSurface( bg, NULL, screen, NULL );
SDL_BlitSurface( dot, NULL, screen, &posRect );
SDL_Flip( screen );
}
यह कोड है जो स्क्रीन के नीचे एक डॉट को स्थानांतरित करता है। मुझे लगता है कि मेरे पास अब तक सब कुछ सही है। यह स्क्रीन को नीचे ले जाता है, लेकिन एक अजीब सी चीज़ होती है जो कि मैं समझा नहीं सकता। जब यह उस y- मान से अधिक हो जाता है तो डॉट को y = 580 पर रहना चाहिए। हालाँकि, हर बार जब मैं प्रोग्राम चलाता हूं, तो डॉट एक अलग स्थान पर समाप्त हो जाएगा, जिसका अर्थ 580 से थोड़ा अधिक है, इसलिए डॉट स्क्रीन से आधी या आधी से अधिक है (डॉट 20 पिक्सेल है, स्क्रीन आयाम 800x600)। अगर मैं प्रोग्राम के टाइटल-बार को क्लिक और होल्ड करने जैसा कुछ करता हूं, और फिर रिलीज़ होता है, तो डॉट स्क्रीन से गायब हो जाता है। यह हर बार परिवर्तनशील कैसे होता है? जैसा कि टाइटलर समस्या के लिए मुझे लगता है कि यह इसलिए है क्योंकि जब मैं टाइटलबार को पकड़ता हूं, तो टाइमर अभी भी चल रहा है, और समय बीतने पर बड़ा हो जाता है, एक बड़ी दूरी के परिणामस्वरूप डॉट अगले फ्रेम में चलती है। क्या वह सही है?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
फिर करते हैं:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }