Ho letto altri due thread qui sul movimento: movimento basato sul tempo Vs movimento basato sulla frequenza dei fotogrammi? e quando devo utilizzare un passaggio temporale fisso o variabile?
ma penso che mi manchi una conoscenza di base del movimento indipendente dal frame perché non capisco di cosa stia parlando nessuno di questi thread.
Sto seguendo i tutorial SDL di lazyfoo e ho seguito la lezione indipendente dal frame. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Non sono sicuro di ciò che la parte di movimento del codice sta cercando di dire, ma penso che sia questo (per favore correggimi se sbaglio): per avere un movimento indipendente dal frame, dobbiamo scoprire fino a che punto un oggetto ( es. sprite) si sposta in un determinato intervallo di tempo, ad esempio 1 secondo. Se il punto si sposta a 200 pixel al secondo, allora devo calcolare di quanto si sposta all'interno di quel secondo moltiplicando 200 pps per 1/1000 di secondo.
È giusto? La lezione dice:
"velocità in pixel al secondo * tempo dall'ultimo fotogramma in secondi. Quindi se il programma funziona a 200 fotogrammi al secondo: 200 pps * 1/200 secondi = 1 pixel"
Ma ... pensavo che stessimo moltiplicando 200 pps per 1/1000 di secondo. Cos'è questa attività con i frame al secondo?
Gradirei se qualcuno potesse darmi una spiegazione un po 'più dettagliata su come funziona il movimento indipendente dal frame.
Grazie.
INOLTRE:
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 );
}
Questo è il codice che sposta un punto sullo schermo. Penso di avere tutto corretto finora. Si sposta sullo schermo ma succede qualcosa di strano che non riesco a spiegare. Si suppone che il punto rimanga su y = 580 quando arriva a un valore maggiore di quel valore y. Tuttavia, ogni volta che eseguo il programma, il punto finirà in una posizione diversa, il che significa da un po 'a molto più di 580, quindi il punto è a metà o più della metà dello schermo (il punto è 20 pixel, schermo dimensioni 800x600). Se faccio qualcosa come fare clic e tenere premuta la barra del titolo del programma, quindi rilasciare, il punto scompare dallo schermo. Come mai è variabile ogni volta? Per quanto riguarda il problema della barra del titolo, penso che sia perché quando mi aggrappo alla barra del titolo, il timer è ancora in esecuzione e il tempo trascorso aumenta, con conseguente distanza maggiore il punto si sposta nel fotogramma successivo. È giusto?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
quindi fai:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }