我在Flash / Actionscript / Starling中实现了一个游戏循环,我想把它扔给你,看看这是否是一个有效的实现。 我想要一个可变的时间步骤方法。
private var _deltaTime:Number = 0;
private var _lastTime:Number = 0;
private var _speed = 1000 / 40;
private function onEnterFrame() {
var now = new Date().getTime();
var delta = now - _lastTime;
_deltaTime += delta - _speed;
_lastTime = now;
//skip if frame rate to fast
if (_deltaTime <= -_speed) {
_deltaTime += _speed;
return;
}
update();
}
private function update() {
updateGameState();
if (_deltaTime >= _speed) {
_deltaTime -= _speed;
update();
}
}
我得到的是,我有一个恒定的速度(或多或少)。
我的问题是有更好的方法,以便运动会出现 平滑。
让我感到惊讶的是,即使FPS几乎不变(60FPS) 与天真的游戏环相比,这种运动有时会颠簸而且更加平滑。
答案 0 :(得分:4)
你走在正确的轨道上 - 假设onEnterFrame是由Event.ENTER_FRAME以某种方式触发的 - 而不是跳过更新,而是在每一帧上调用它,但传递过去的时间:
private function onEnterFrame() {
var now = new Date().getTime();
var delta = now - _lastTime;
_lastTime = now;
updateGameState(delta/1000);//divide by 1000 to give time in seconds
}
在updateGameState中,您可以使用&#39; delta&#39;计算运动等,例如:
function updateGameState(timeElapsed:Number):void {
myAlien.x += myAlienSpeedPerSecond*timeElapsed;
}
这样即使帧速率变化,您也能获得平稳的移动。
答案 1 :(得分:0)
表明,经过的时间内置于EnterFrameEvent类中。
// the corresponding event listener
private function onEnterFrame(event:EnterFrameEvent):void
{
trace("Time passed since last frame: " + event.passedTime);
enemy.moveBy(event.passedTime * enemy.velocity);
}
http://wiki.starling-framework.org/manual/animation#enterframeevent