Eu li dois outros tópicos aqui sobre movimento: movimento baseado no tempo versus movimento baseado na taxa de quadros? , e quando devo usar uma etapa de tempo fixo ou variável?
mas acho que não tenho um entendimento básico do movimento independente de quadros, porque não entendo do que esses tópicos estão falando.
Estou acompanhando os tutoriais SDL do lazyfoo e deparei-me com a lição independente de estrutura. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Não tenho certeza do que a parte do movimento do código está tentando dizer, mas acho que é isso (por favor, corrija-me se estiver errado): Para ter um movimento independente do quadro, precisamos descobrir a que distância um objeto ( por exemplo, sprite) se move dentro de um determinado período de tempo, por exemplo, 1 segundo. Se o ponto se move a 200 pixels por segundo, preciso calcular quanto ele se move nesse segundo, multiplicando 200 pps por 1/1000 de segundo.
Isso está certo? A lição diz:
"velocidade em pixels por segundo * tempo desde o último quadro em segundos. Portanto, se o programa for executado a 200 quadros por segundo: 200 pps * 1/200 segundos = 1 pixel"
Mas ... pensei que estávamos multiplicando 200 pps por 1/1000 de segundo. O que é esse negócio com quadros por segundo?
Eu apreciaria se alguém pudesse me dar uma explicação um pouco mais detalhada de como o movimento independente de estrutura funciona.
Obrigado.
ADIÇÃO:
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 );
}
Esse é o código que move um ponto na tela. Eu acho que tenho tudo correto até agora. Ele se move para baixo na tela, mas há uma coisa estranha que eu não consigo explicar. O ponto deve permanecer no valor y = 580 quando chegar a um valor superior ao valor y. No entanto, toda vez que executo o programa, o ponto acaba em um local diferente, o que significa um pouco mais que 580, portanto, o ponto está na metade ou mais da metade da tela (o ponto é 20 pixels, tela dimensões 800x600). Se eu fizer algo como clicar e segurar a barra de título do programa e soltar, o ponto desaparecerá da tela. Como é que é variável a cada vez? Quanto ao problema da barra de título, acho que é porque quando eu seguro a barra de título, o temporizador ainda está em execução e o tempo decorrido aumenta, resultando em uma distância maior, o ponto se move no próximo quadro. Isso está certo?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
então faça:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }