que votre boucle principale du jeu est quelque chose comme:
this.addEventListener(Event.ENTER_FRAME, gameLoop, false, 0, true);
var _timer = 0; // starts as zero
const WORLD_TIME_FACTOR:Number = 2;
function gameLoop(e:Event):void {
// all your game logic happens here
_timer++;
}
function getWorldTime():Number {
return (_timer/stage.frameRate) * WORLD_TIME_FACTOR;
}
// later (you can adjust WORLD_TIME_FACTOR to be anything, 2 would indicate that the
// game world happens twice as quick as in real life (like your examples)
//
trace(getWorldTime()); // At 3 seconds real world, would trace 6
trace(getWorldTime()); // At 33 seconds real world, would trace 66
Vous formate alors ce nombre en minutes avec quelque chose comme:
const div60:Number = 1/60;
const div120:Number = 1/60/60;
function format_time(value:Number):String {
// x >> 0 is the same as int(x) but quicker
var minutes:String = String((value* div60 >> 0) % 60);
minutes = (minutes == "60") ? "00" : minutes;
minutes = (minutes.length == 1) ? "0" + minutes : minutes;
var seconds:String = String(value% 60);
seconds = (seconds.length == 1) ? "0" + seconds : seconds;
return (value* div120 >> 0) + ":" + minutes + ":" + seconds;
}
vous donc enfin avoir
trace(format_time(getWorldTime())); // At 72 (1 minute, 12 secs) seconds real world, would trace 00:02:24
Notez que flash, vous ne pouvez pas compter sur 'stage.frameRate' et compter les trames, vraiment. 'frameRate' est au mieux un indice pour le joueur indiquant le nombre maximum d'images que vous voulez. Mais il n'y a aucune garantie que votre swf fonctionnera exactement à, disons, 30 FPS. Tu ferais mieux de calculer les deltas. Une fonction pratique et simple pour cela est getTimer(). Capturez l'heure initiale, puis, lorsque l'horloge se déclenche à nouveau (entrez frame, timer, any), appelez getTimer et soustrayez la valeur renvoyée à la valeur précédente pour obtenir le temps écoulé. –
Oui, c'est vrai. – Chris
merci beaucoup! cela fonctionne vraiment en utilisant un auditeur Timer! – ShadowG