【问题标题】:Calculating Frame Independent Acceleration In ActionScript 3在 ActionScript 3 中计算与帧无关的加速度
【发布时间】:2012-02-12 00:50:40
【问题描述】:

我有一个以每秒 60 帧的速度运行的 2D 横向滚动游戏(使用 ActionScript 3 制作)。我正在尝试使其独立于帧速率,以便它可以在较慢的设备上运行。

为此,我创建了一个名为 timeElapsed 的变量,方法是计算每帧之间经过的毫秒数并将其除以 16(我认为 60 fps 约为 16 毫秒。)因此,在 60 fps 时,结果约为1. 然后我用这个数字计算任何时间相关的变量(例如player.x = speed * timeElapsed;)这是代码:

private var oldTime          :Number;
private var defaultFrameRate :uint = 16; // the default frame rate in milliseconds
private var timeElapsed      :Number;

...

var newTime      :Number = getTimer();
var timePassed   :Number = newTime - this.oldTime;

this.timeElapsed = timePassed / this.defaultFrameRate;
this.oldTime     = newTime;

问题是,当我尝试在涉及每帧移动速度更快的对象的情况下应用它时,我遇到了这个问题:

这是导致问题的代码(我为这个例子做了一点改动):

private var speed        :Number = 100;
private var acceleration :Number =  10;

...

this.speed += (this.acceleration * this.timeElapsed);
this.x     += this.speed * this.timeElapsed;

问题是这样的(不是真实值,只是一个例子):

At 60 FPS:
frame 1: speed = 110; player.x = 110;
frame 2: speed = 120; player.x = 230;
frame 3: speed = 130; player.x = 360;
frame 4: speed = 140; player.x = 500;

At 30 FPS (At half the frame rate but the same ammount of real time):
frame 1: speed = 240; player.x = 240;
frame 2: speed = 280; player.x = 560;

如您所见,以每秒 30 帧的速度,播放器在相同的实时时间内移动得更远。问题似乎是,在第一帧 30fps 时,我当前的代码没有考虑到 60fps 时第一帧和第二帧之间速度的细微差别。 我想在 60fps 时获得任意两帧之间的速度平均值,并在帧速率发生变化时使用它来计算更准确的值,但我觉得在某些其他情况下无法正常工作,例如在 60fps 时,它会将玩家移动 115 像素而不是 110 像素。

他们有什么方法可以准确地模拟以独立于帧速率的方式加速的对象吗?

提前谢谢你。

【问题讨论】:

    标签: flash actionscript-3 frame-rate


    【解决方案1】:

    我认为您不应该将速度乘以经过的时间,因为您已经在计算加速度时考虑了经过的时间:

    this.speed += (this.acceleration * this.timeElapsed);
    this.x     += this.speed;
    

    【讨论】:

    • 感谢您的回复。我一开始就是这样做的,但我意识到,例如,以每秒 30 帧的速度,我不仅需要弥补失去的加速度,而且还需要物体行进两倍的距离才能使为 30 帧的损失距离做准备。不过,我认为您说我现在所做的也不是正确的实现可能是对的。
    • 它将行进两倍的距离,因为speed 将加倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多