2016-04-10 8 views
1
//Calculate time step 
    float timeStep = stepTimer.getTicks()/1000.f; 

    //Move for time step 
    dot.move(timeStep); 

    //Restart step timer 
    stepTimer.start(); 

Dieser Code aus Lazy Foo SDL Tutorials sollte eine variable Zeitschritt basierte Bewegung System erstellen. Meine Hauptfrage dazu ist, wie es funktioniert? float timeStep = stepTimer.getTicks()/1000.f; berechnet die verstrichene Zeit in Sekunden. Wenn also beispielsweise 2 Millisekunden seit dem letzten Aufruf vergangen sind, wird timeStep var 0,02 Sekunden lang sein. Wie ist das möglicherweise im Code nutzbar? Wenn ich eine konstante Geschwindigkeit von 10 Pixeln pro Sekunde habe und ich möchte, dass diese Geschwindigkeit mit jeder Framerate arbeitet, müsste ich meinen px/s mit diesem Wert multiplizieren (0,02).Wie funktioniert Bewegung in einem Spiel-Engine

Dies würde jedoch die folgenden posx += 10*0.02 ergeben. Und wie wir gerade gelernt haben, bedeutet das, dass wir die Position um einen Wert von 0,2 Pixeln erhöhen (was natürlich nicht funktioniert und nur den Wert unterschreitet).

Was fehlt mir hier?

Antwort

4

Sie pflegen eine Positionsvariable im Code; ein Gleitkommawert, der genau ist und kleine Änderungen akzeptiert, bis auf die Anzahl der Signifikanten (ca. 7 für 32-Bit-Gleitkommazahlen und 14 für 64-Bit-Gleitkommazahlen).

Dann zeichnen Sie auf den Bildschirm von diesem.

Für eine Weile wird es zu einem Pixel übersetzt (oder sagen gerundet) werden nach einer Weile auf die benachbarten Pixel usw.

Sie Fehler ist, dass Sie Pixel verwenden (es auf diese Weise oder zu interpretieren) Adressen als Positionsdaten. Ein Bildschirm hat nur einen stark begrenzten "numerischen Platz". Überlegen Sie, ob Sie Mathe mit Ganzzahlen zwischen 0 und 2000 durchführen möchten. Wird dich nicht weit bringen.

4

Aus Ihrer Frage, ich nehme an, Sie speichern die Position Ihrer Objekte als ganzzahlige Koordinaten, die das Pixel darstellt, auf dem es sich befindet. Die Antwort auf deine Frage ist einfach, das nicht zu tun. Speichern Sie den Speicherort als Gleitkommawert, der möglicherweise einen Bruchteil eines Pixels darstellt oder eine beliebige andere Messung, die Sie verwenden möchten. Wenn Ihr Zeichensystem ganzzahlige Pixelkoordinaten benötigt, können Sie diese einfach in die Zeichnungsstufe konvertieren.