MovieClip Y 位置在使用增量时间的更新循环中变为负数
MovieClip Y position becomes negative on update loop using delta time
我正在用 Flash AS3 编写游戏代码,我已经使用此处提供的答案实现了我的游戏循环:Is this a good implementation of the gameloop
但是,在将我的影片剪辑的 y 位置增加 dist(dist 来自速度 * timeElapsed)之后,影片剪辑的 y 位置变为负数。
我通过跟踪每次更新的动画片段位置注意到了这个负值。
见代码:
public class GameWorld extends MovieClip {
var speed:Number = 250;
var balls:Array = [];
private var _lastTime:Number = 0;
public function GameWorld() {
createballs();
this.addEventListener(Event.ENTER_FRAME, loop);
}
public function loop(e:Event):void
{
var now = new Date().getTime();
var _delta = now - _lastTime;
_lastTime = now;
updateGameState(_delta/1000);
}
public function updateGameState(timeElapsed:Number):void
{
var dist:Number = speed * timeElapsed;
balls[0].y += dist;
trace(balls[0].y);
}
public function createballs():void
{
for(var i:int = 0; i < 1; i++)
{
var ball:Ball = new Ball();
ball.y = 100;
ball.x = 100;
addChild(ball);
balls.push(ball);
}
}
}
我想知道是什么导致了影片剪辑 y 位置的突然负值。
是的,正如@Vesper 所建议的,我发现问题出在第一个非常大的增量值上,因为 _lastTime 为零。解决方案是在循环开始之前获取当前时间(在舞台上添加事件侦听器之前)并将其用作第一次更新中的 lastTime 即
.....
_lastTime = new Date().getTime();
//this is the looper function called on each frame
this.addEventListener(Event.ENTER_FRAME, _onEnterFrame);
}
public function _onEnterFrame(e:Event):void
{
var now = new Date().getTime();
var _delta;
_delta = now - _lastTime;
_lastTime = now;
updateGameState(_delta/1000);
}
这样一来,第一个 _deltaTime 非常小,接近于零,因此 dist 将为零,这完全正确,因为对象的起点相对于自身是 0。
我正在用 Flash AS3 编写游戏代码,我已经使用此处提供的答案实现了我的游戏循环:Is this a good implementation of the gameloop 但是,在将我的影片剪辑的 y 位置增加 dist(dist 来自速度 * timeElapsed)之后,影片剪辑的 y 位置变为负数。 我通过跟踪每次更新的动画片段位置注意到了这个负值。
见代码:
public class GameWorld extends MovieClip {
var speed:Number = 250;
var balls:Array = [];
private var _lastTime:Number = 0;
public function GameWorld() {
createballs();
this.addEventListener(Event.ENTER_FRAME, loop);
}
public function loop(e:Event):void
{
var now = new Date().getTime();
var _delta = now - _lastTime;
_lastTime = now;
updateGameState(_delta/1000);
}
public function updateGameState(timeElapsed:Number):void
{
var dist:Number = speed * timeElapsed;
balls[0].y += dist;
trace(balls[0].y);
}
public function createballs():void
{
for(var i:int = 0; i < 1; i++)
{
var ball:Ball = new Ball();
ball.y = 100;
ball.x = 100;
addChild(ball);
balls.push(ball);
}
}
}
我想知道是什么导致了影片剪辑 y 位置的突然负值。
是的,正如@Vesper 所建议的,我发现问题出在第一个非常大的增量值上,因为 _lastTime 为零。解决方案是在循环开始之前获取当前时间(在舞台上添加事件侦听器之前)并将其用作第一次更新中的 lastTime 即
.....
_lastTime = new Date().getTime();
//this is the looper function called on each frame
this.addEventListener(Event.ENTER_FRAME, _onEnterFrame);
}
public function _onEnterFrame(e:Event):void
{
var now = new Date().getTime();
var _delta;
_delta = now - _lastTime;
_lastTime = now;
updateGameState(_delta/1000);
}
这样一来,第一个 _deltaTime 非常小,接近于零,因此 dist 将为零,这完全正确,因为对象的起点相对于自身是 0。