Ich habe hier zwei andere Themen zum Thema Bewegung gelesen: Zeitbasierte Bewegung Vs Bildratenbasierte Bewegung? und Wann sollte ich einen festen oder variablen Zeitschritt verwenden?
Aber ich glaube, mir fehlt ein grundlegendes Verständnis der rahmenunabhängigen Bewegung, weil ich nicht verstehe, wovon einer dieser Threads spricht.
Ich verfolge die SDL-Tutorials von lazyfoo und bin auf die rahmenunabhängige Lektion gestoßen. http://lazyfoo.net/SDL_tutorials/lesson32/index.php
Ich bin nicht sicher, was der Bewegungsteil des Codes zu sagen versucht, aber ich denke, es ist dies (bitte korrigieren Sie mich, wenn ich falsch liege): Um eine rahmenunabhängige Bewegung zu haben, müssen wir herausfinden, wie weit ein Objekt ist ( Beispiel Sprite) bewegt sich innerhalb eines bestimmten Zeitrahmens, zum Beispiel 1 Sekunde. Wenn sich der Punkt mit 200 Pixel pro Sekunde bewegt, muss ich berechnen, wie viel er sich innerhalb dieser Sekunde bewegt, indem ich 200 pps mit 1/1000 Sekunde multipliziere.
Ist das richtig? Die Lektion sagt:
"Geschwindigkeit in Pixel pro Sekunde * Zeit seit dem letzten Bild in Sekunden. Wenn das Programm also mit 200 Bildern pro Sekunde ausgeführt wird: 200 pps * 1/200 Sekunden = 1 Pixel"
Aber ... ich dachte, wir multiplizieren 200 pps mit 1/1000 Sekunde. Was ist das für ein Geschäft mit Bildern pro Sekunde?
Ich würde mich freuen, wenn mir jemand eine etwas detailliertere Erklärung geben könnte, wie rahmenunabhängige Bewegungen funktionieren.
Vielen Dank.
ZUSATZ:
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 );
}
Das ist Code, der einen Punkt auf dem Bildschirm nach unten bewegt. Ich denke, ich habe bisher alles richtig gemacht. Es bewegt sich auf dem Bildschirm nach unten, aber es passiert etwas Seltsames, das ich nicht erklären kann. Der Punkt soll bei y = 580 bleiben, wenn er größer als dieser y-Wert wird. Jedes Mal, wenn ich das Programm starte, landet der Punkt an einer anderen Stelle, was ein wenig bis viel mehr als 580 bedeutet, sodass der Punkt auf halber oder mehr als auf halber Höhe vom Bildschirm entfernt ist (der Punkt ist 20 Pixel, Bildschirm Abmessungen 800x600). Wenn ich so etwas wie die Titelleiste des Programms anklicke und halte und dann loslasse, verschwindet der Punkt vom Bildschirm. Wie kommt es, dass es jedes Mal variabel ist? Was das Problem mit der Titelleiste betrifft, denke ich, dass der Timer noch läuft, wenn ich mich an der Titelleiste festhalte, und die verstrichene Zeit größer wird. Dies führt zu einer größeren Entfernung, um die sich der Punkt im nächsten Frame bewegt. Ist das richtig?
yMovement = (yVel * (SDL_GetTicks() - startTicks)/1000.f);
dann mach:if(y + yMovement <= 580){ y += yMovement; } else { y = 580; }