You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
2.3 KiB
HTML

<!menue>
<h1>Basis Timer für Bewegung und Steuerung</h1>
<h2>Frameloop Zeit und Animation</h2>
<p>Ab Programmstart läuft ein interner Zähler der mit der höhsten Auflösung des Betriebssystems läuft.
Der Zähler ist auf Sekunden umgerechnet, egal unter welchen Treiber die Engine lauft, es sind immer Sekunden und Sekundenbruchteile abgespeichert. Die Auflösung ist mindestens 1/1000 Sekunde (ms).
Die Level One Engine steuert alle Bewegungungen, Abläufe und Animationen über diesen Zähler.
</p>
<h2>Standard Frameloop ohne Timer</h2>
<!img=FrameLoop_No_Timer.gif,Frameloop mit Sleep() gesteuerter FPS>
Mit <wF>llirq_Sleep(10) wird dieser Loop maximal mit 1000/10 = 100 fps laufen.
Im Loop wird x_pos um 1 erhöht, das ergibt nach 100 Durchläufen eine Spritebewegung von 100 Pixel pro Sekunde.
Der genaue Zeitpunkt bis zum erreichen der 100 Pixel ist nicht vorherbestimmbar, die benötigte Zeit für die Funktionen llirq_DrawSprites(), llirq_FlipScreen() und llinput_Update() sind unbestimmt.
Das ist durchaus ein Nachteil, die Bewegung wird ruckelig wenn die FPS Rate von 100 nicht gehalten werden kann.
<h2>Standard Frameloop mit Timer</h2>
<!img=FrameLoop_MaxFps_with_Timer.gif,Frameloop mit Maximal FPS und deltatime gesteuerter Bewegung>
Die Konstante <wD>SPEED definiert die gewünschte Bewegung innerhalb einer Sekunde. Das Sprite soll sich 100 pixel in exakt einer Sekunde bewegen. Durch die <§t=Division 1.0f<wS>(Sekunde) / 100<wS>(Bewegung)§> ergibt sich eine SPEED Konstante.
Im Frameloop wird zuerst die letzte Framezeit mit GetDeltaTime() geholt. Delta ist ein Sekundenbruchteil.
<§t=Neue Position = Alte Position + Speedkonstante multipliziert mit Delta.§>
Nach Ablauf einer Sekunde befindet sich das Sprite exakt auf Position 100. Das Zeichnen wurde mit der höhstmöglichen FPS Zahl erreicht, an langsamen Systemen unter 100 fps, auf schnelleren eben schneller. Die FPS sind nicht mehr relevant.
Achtung: Alle delta gesteuerten Werte sollten floats sein.
<h2>Code Schnipsel</h2>
<!rtf=GetRand_snipps>
<!h2a=llirq_ResetTime(),Engine Timer R&uuml;cksetzen,llirq_ResetTime>
<!xml=llirq_ResetTime,function.xsl>
<!h2a=llirq_GetDeltaTime(),llirq_GetDeltaTime(),llirq_GetDeltaTime>
<!xml=llirq_GetDeltaTime,function.xsl>
<!h2a=llirq_GetTime(),llirq_GetTime(),llirq_GetTime>
<!xml=llirq_GetTime,function.xsl>
<!h2a=llirq_Sleep(),llirq_Sleep(),llirq_Sleep>
<!xml=llirq_Sleep,function.xsl>