Я читав дві інші теми тут про рух: Рух на основі часу Vs Частота руху на основі частоти? , і коли я повинен використовувати фіксований або змінний крок часу?
але я думаю, що мені бракує базового розуміння кадрового незалежного руху, тому що я не розумію, про що йдеться в будь-якій з цих ниток.
Я слідую за підручниками SDL від lazyfoo і натрапив на самостійний урок кадрів. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Я не впевнений, що намагається сказати частина руху в коді, але я вважаю, що це (будь-ласка, виправте мене, якщо я помиляюся). напр. спрайт) рухається протягом певного часового періоду, наприклад, 1 секунди. Якщо крапка рухається зі швидкістю 200 пікселів в секунду, то мені потрібно обчислити, скільки вона рухається за ту секунду, множивши 200 пікселів на 1/1000 секунди.
Це так? Урок говорить:
"швидкість у пікселях в секунду * час з моменту останнього кадру в секундах. Отже, якщо програма працює зі швидкістю 200 кадрів в секунду: 200 pps * 1/200 секунд = 1 піксель"
Але ... я думав, що ми множимо 200 пікселів на 1/1000-ту секунду. Що це за бізнес з кадрами в секунду?
Буду вдячний, якщо хтось міг би дати мені трохи більш детальне пояснення щодо того, як працює незалежний рух кадрів.
Дякую.
ДОПОМОГА:
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 = 580, коли вона досягне більшого, ніж значення y. Однак кожного разу, коли я запускаю програму, крапка виявиться в іншому місці, тобто трохи більше, ніж 580, тому точка знаходиться на півдорозі або більше, ніж на півдорозі від екрана (крапка - 20 пікселів, екран розміри 800х600). Якщо я щось на зразок натискаю і тримаю заголовок програми, а потім відпускаю, точка зникає з екрана. Як це змінювати кожен раз? Щодо проблеми з заголовком, я думаю, це тому, що коли я тримаюсь за заголовком, таймер все ще працює, а час, що минув, збільшується, в результаті на великій відстані точка рухається в наступному кадрі. Це так?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
тоді робіть:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }