Я читал две другие темы здесь о движении: движение на основе времени против движения на основе частоты кадров? , и когда я должен использовать фиксированный или переменный шаг по времени?
но я думаю, что мне не хватает базового понимания движений, независимых от фреймов, потому что я не понимаю, о чем идет речь в этих темах.
Я следую инструкциям SDL от lazyfoo и наткнулся на независимый от фрейма урок. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Я не уверен, что пытается сказать движущаяся часть кода, но я думаю, что это так (пожалуйста, исправьте меня, если я ошибаюсь): чтобы иметь независимое от фрейма движение, нам нужно выяснить, как далеко находится объект ( например, спрайт) перемещается в течение определенного периода времени, например 1 секунда. Если точка движется со скоростью 200 пикселей в секунду, то мне нужно вычислить, сколько она движется в течение этой секунды, умножив 200 pps на 1/1000 секунды.
Это правильно? Урок говорит:
«скорость в пикселях в секунду * время с последнего кадра в секундах. Поэтому, если программа работает со скоростью 200 кадров в секунду: 200 pps * 1/200 секунд = 1 пиксель»
Но ... я думал, что мы умножаем 200 pps на 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; }