He leído otros dos hilos aquí sobre el movimiento: Movimiento basado en el tiempo Vs ¿Movimiento basado en la velocidad de fotogramas? , y ¿ Cuándo debo usar un paso de tiempo fijo o variable?
pero creo que me falta una comprensión básica del movimiento independiente del marco porque no entiendo de qué están hablando ninguno de esos hilos.
Estoy siguiendo los tutoriales SDL de lazyfoo y encontré la lección independiente del marco. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
No estoy seguro de lo que la parte de movimiento del código está tratando de decir, pero creo que es esto (corríjame si me equivoco): para tener un movimiento independiente del marco, necesitamos averiguar qué tan lejos está un objeto ( ej. sprite) se mueve dentro de un cierto período de tiempo, por ejemplo 1 segundo. Si el punto se mueve a 200 píxeles por segundo, entonces necesito calcular cuánto se mueve dentro de ese segundo multiplicando 200 pps por 1/1000 de segundo.
¿Está bien? La lección dice:
"velocidad en píxeles por segundo * tiempo desde el último fotograma en segundos. Entonces, si el programa se ejecuta a 200 fotogramas por segundo: 200 pps * 1/200 segundos = 1 píxel"
Pero ... pensé que estábamos multiplicando 200 pps por 1/1000 de segundo. ¿Qué es este negocio con cuadros por segundo?
Agradecería si alguien me pudiera dar una explicación un poco más detallada sobre cómo funciona el movimiento independiente del marco.
Gracias.
ADICIÓN:
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 );
}
Ese es el código que mueve un punto por la pantalla. Creo que tengo todo correcto hasta ahora. Se mueve hacia abajo en la pantalla, pero sucede algo extraño que no puedo explicar. Se supone que el punto permanece en y = 580 cuando llega a ser mayor que ese valor de y. Sin embargo, cada vez que ejecuto el programa, el punto terminará en una ubicación diferente, lo que significa un poco más de 580, por lo que el punto está a la mitad o más de la mitad de la pantalla (el punto tiene 20 píxeles, pantalla dimensiones 800x600). Si hago algo como hacer clic y mantener presionada la barra de título del programa, y luego soltarlo, el punto desaparece de la pantalla. ¿Cómo es que es variable cada vez? En cuanto al problema de la barra de título, creo que es porque cuando me aferro a la barra de título, el temporizador todavía se está ejecutando y el tiempo transcurrido aumenta, resultando en una distancia mayor, el punto se mueve en el siguiente cuadro. ¿Está bien?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
luego hacer:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }