SINGLE POST

Race Games: Chronometry

Wer Spiele in Flash produziert weiß, dass die Berechnung von Spieldauer über Framerate oder setInterval ausgeführte Methoden nicht sehr zuverlässig ist. Die Framerate pulsiert zu sehr und selbst eine Interpolation über 50 Durchläufe (50 Bildschirmrenderingvorgänge) ist nicht genau genug ein Durchschnittsergebniss für z.B: ein 1- minütiges Spiel zu liefern.

Damit fällt die bekannte Methode über

[as]var timestamp:Number = getTimer():[/as]

sowieso schon weg. Als ich für das Rennspiel Formula Private vor dem Problem stand, dass die Spielergebnisse derart abhängig von Auflösung, CPU (Taktfrequenz, Architektur und Hersteller), RAM etc. war, selbst wenn subjektiv ein flüssiger Rennlauf gewährleistet schien.

Nachdem ich mir den Kopf zerbrochen hatte, fiel mir ein wie einfach das ganze eigentlich ist.

Wenn ich nur die Abweichung pro Interval hinzufüge, müsste das Ergebniss stimmen, oder auch wenn ich pro Intervaldurchlauf eine vorgegebene Zeit iteriere und nicht den exakten Timestamp. So kann es sein das ein 40ms Interval zwar 50, 60 oder sogar 80ms benötigt, die Sekunde subjektiv wahrscheinlich irgendwann zu lange dauert, aber die Resultate zufriedenstellend sind.

Hier ein Beispiel zur Implementierung:

Die Funktion die getTimer ersetzt.

[as]

private function getTimeI(interval_number):Number {
return _getTimeI;
}

[/as]

Beispiel für intervalbasiere Funktionsaufrufe (setInterval calls method)

[as]

private function init():Void {

var intervalStep:Number = 40;
var _getTimeI:Number = getTimer();
}

setInterval(this, “calledMethod”, interval_step);

private function calledMethod():Void {

_getTimeI += intervalStep;
trace(“ts: ” + getTimeI());
}

[/as]


Comments are closed.