Actionscript 3 equivalente a XNA ElapsedGameTime

Por lo general, desarrollo juegos usando XNA y una de las cosas comunes que se deben hacer cuando se usa XNA es asegurarse de actualizar cada entidad en función de ElapsedGameTime. Esto permite un movimiento suave incluso con una velocidad de fotogramas variable.

Estoy buscando esa funcionalidad en AS3 usando FlashDevelop.

Hasta ahora se me ocurrió:

public function Update():void
{
    var currentTime:Number = getTimer();
    var elapsedTime:Number = currentTime - lastFrame;
    elapsedTime /= 1000;

    //use elapsedTime here for movement
    player.x += speed.x * elapsedTime

    lastFrame = getTimer();
}

Al usar esto, realmente no puedo decir si realmente funciona o no. Realmente no veo la diferencia cuando implemento esto.

¿Es esto parecido? Hay otra manera de hacer esto?

preguntado el 12 de junio de 12 a las 22:06

2 Respuestas

Parece que es posible que no vea ninguna diferencia entre usar esto y usar un controlador enter_frame si es el caso, probablemente sea cierto que todo el procesamiento necesario para un cuadro determinado se realiza dentro del tiempo asignado y en realidad es capaz de actualizarse sin problemas a 1/24 de segundo (el frameRate predeterminado es 24). Una forma de probar la diferencia sería modificar la propiedad frameRate y ver si la velocidad de tu "personaje" se ve afectada por el cambio en frameRate. También puede usar una declaración de seguimiento como trace(elapsedTime), también puede agregar un controlador de eventos enter_frame y realizar un seguimiento de los fotogramas y rastrearlos también para obtener una mejor idea de cómo funciona esto y qué diferencia está haciendo, si es que hay alguna. Esta parece una forma totalmente válida de hacerlo, aunque no he hecho mucha programación de juegos Flash, al tener mucha experiencia con el desarrollo de Flash RIA no veo nada malo en este método.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/core/Application.html#frameRate

si usa AS3 puro, configuraría esto usando metadatos en su clase principal como:

http://flassari.is/2009/02/swf-metadata-in-pure-as3-projects/

http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf680e1-7ffe.html#WS4b4ddee4904fe7796d38fa291219d46bcb4-8000

Respondido el 12 de junio de 12 a las 23:06

Puede intentar usar la clase de temporizador en lugar de ENTER_FRAME

var myTimer:Timer = new Timer(1000, 1); // (ms, repeats = set to 0 for infinity)
myTimer.addEventListener(TimerEvent.TIMER, runOnce);
myTimer.start();

function runOnce(event:TimerEvent):void {
    trace("runOnce() called @ " + getTimer() + " ms");
}


var myTimer:Timer = new Timer(1000); // (ms)
myTimer.addEventListener(TimerEvent.TIMER, runMany);
myTimer.start();

function runMany(event:TimerEvent):void {
    trace("runMany() called @ " + getTimer() + " ms");
}

Respondido el 13 de junio de 12 a las 09:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.