1

我通常使用 XNA 开发游戏,使用 XNA 时要做的一件常见事情是确保根据 ElapsedGameTime 更新每个实体。即使在可变帧速率下,这也允许平滑移动。

我正在使用 FlashDevelop 在 AS3 中寻找该功能。

到目前为止,我想出了:

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();
}

使用它,我无法真正判断它是否真的有效。当我实现这个时,我真的看不出有什么区别。

这是相似的吗?还有另一种方法可以做到这一点吗?

4

2 回答 2

2

如果是这种情况,您可能会发现使用 this 与使用 enter_frame 处理程序没有区别在 1/24 秒(默认 frameRate 为 24)。测试差异的一种方法是修改 frameRate 属性并查看“角色”的速度是否受到 frameRate 变化的影响。您还可以使用 trace(elapsedTime) 之类的跟踪语句,您还可以添加一个 enter_frame 事件处理程序并跟踪帧并跟踪它,以便更好地了解它的执行方式以及它产生的任何差异。这似乎是一个完全有效的方法,虽然我没有'

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

如果使用纯 AS3,您将使用主类上的元数据进行设置,例如:

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

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

于 2012-06-12T22:42:05.243 回答
0

您可以尝试使用 Timer Class 而不是 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");
}
于 2012-06-13T08:20:06.563 回答