Przeczytałem tutaj dwa inne wątki dotyczące ruchu: Ruch oparty na czasie Vs Ruch oparty na liczbie klatek na sekundę? , i kiedy powinienem zastosować stały lub zmienny krok czasu?
ale myślę, że brakuje mi podstawowej wiedzy na temat ruchu niezależnego od ramki, ponieważ nie rozumiem, o czym mówi którykolwiek z tych wątków.
Śledzę samouczki SDL firmy Lazyfoo i przyszedłem do lekcji niezależnej od ramki. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Nie jestem pewien, co próbuje powiedzieć część dotycząca ruchu w kodzie, ale myślę, że jest to (popraw mnie, jeśli się mylę): Aby mieć ruch niezależny od ramki, musimy dowiedzieć się, jak daleko obiekt ( np. duszek) porusza się w określonym przedziale czasowym, na przykład 1 sekunda. Jeśli kropka porusza się z prędkością 200 pikseli na sekundę, muszę obliczyć, jak dużo się porusza w tej sekundzie, mnożąc 200 pps przez 1/1000 sekundy.
Czy to prawda? Lekcja mówi:
„prędkość w pikselach na sekundę * czas od ostatniej klatki w sekundach. Więc jeśli program działa z prędkością 200 klatek na sekundę: 200 pps * 1/200 sekund = 1 piksel”
Ale ... Myślałem, że pomnożymy 200 pps przez 1/1000 sekundy. Co to za biznes z liczbą klatek na sekundę?
Byłbym wdzięczny, gdyby ktoś mógł dać mi bardziej szczegółowe wyjaśnienie, jak działa ruch niezależny od ramki.
Dziękuję Ci.
DODANIE:
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 );
}
To kod, który przesuwa kropkę w dół ekranu. Myślę, że mam wszystko do tej pory prawidłowe. Porusza się w dół ekranu, ale dzieje się coś dziwnego, czego nie potrafię wyjaśnić. Kropka ma pozostać na poziomie y = 580, gdy osiągnie wartość wyższą niż ta wartość y. Jednak za każdym razem, gdy uruchamiam program, kropka kończy się w innym miejscu, co oznacza nieco więcej niż 580, więc kropka znajduje się w połowie lub więcej niż w połowie ekranu (kropka to 20 pikseli, ekran wymiary 800 x 600). Jeśli zrobię coś takiego, jak kliknięcie i przytrzymanie paska tytułu programu, a następnie zwolnienie, kropka zniknie z ekranu. Dlaczego jest zmienna za każdym razem? Jeśli chodzi o problem z paskiem tytułowym, myślę, że to dlatego, że gdy trzymam się paska tytułowego, stoper nadal działa, a upływ czasu staje się większy, co skutkuje większą odległością kropka przesuwa się w następnej klatce. Czy to prawda?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
następnie wykonaj:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }