Actionscript 3 使用增量时间更新循环时,MovieClip Y位置变为负值
我正在用flash AS3编写一个游戏,并使用此处提供的答案实现了我的游戏循环: 但是,将我的movieclip的y位置增加dist(dist是从speed*timeappeased开始的)后,movieclip的y位置变为负值。 通过跟踪每次更新时movieclips的位置,我注意到了这个负值 见代码:Actionscript 3 使用增量时间更新循环时,MovieClip Y位置变为负值,actionscript-3,flash-cs5,flash,Actionscript 3,Flash Cs5,Flash,我正在用flash AS3编写一个游戏,并使用此处提供的答案实现了我的游戏循环: 但是,将我的movieclip的y位置增加dist(dist是从speed*timeappeased开始的)后,movieclip的y位置变为负值。 通过跟踪每次更新时movieclips的位置,我注意到了这个负值 见代码: public class GameWorld extends MovieClip { var speed:Number = 250; var balls:Array = []
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);
}
}
}
公共类游戏世界扩展MovieClip{
无功转速:数=250;
变量:数组=[];
私有变量_lastTime:Number=0;
公共功能游戏世界(){
createballs();
this.addEventListener(Event.ENTER_FRAME,循环);
}
公共函数循环(e:事件):无效
{
var now=new Date().getTime();
var _delta=now-_lastTime;
_上次=现在;
更新平均值(_delta/1000);
}
公共函数updateGameState(timeappeased:Number):无效
{
var dist:数字=速度*经过的时间;
球[0]。y+=dist;
轨迹(球[0].y);
}
公共函数createballs():void
{
对于(变量i:int=0;i<1;i++)
{
变量ball:ball=新的ball();
球y=100;
球x=100;
addChild(ball);
推(球);
}
}
}
我想知道是什么原因导致了moviecY位置突然出现负值。是的,正如@Vesper所建议的,我发现问题是第一个delta值,它非常大,因为_lastTime为零。解决方案是获取循环开始之前的当前时间(在阶段上添加事件侦听器之前),并将其用作第一次更新的最后时间,即
这样一来,第一个增量时间非常小,非常接近于零,因此距离将为零,这是完全正确的,因为对象的起点相对于自身为0。是的,正如@Vesper所建议的,我发现问题是第一个增量值,它非常大,因为“lastTime”为零。解决方案是获取循环开始之前的当前时间(在阶段上添加事件侦听器之前),并将其用作第一次更新的最后时间,即
这样一来,第一个deltaTime非常小,接近于零,因此dist将为零,这完全正确,因为对象的起点相对于自身为0。永远不要计算本地时间只能向前。甚至
flash.utils.getTimer
也不能简单明了。还要检查您的速度是否在某个地方为负值。编辑:您应该初始化private var\u lastTime:Number=0代码>在开始游戏循环之前使用正确的值,否则你会得到第一个增量作为非常奇怪的值。嗨,当我跟踪增量值时,它总是正值,并且每个循环中的var dist都是正值。永远不要计算本地时间只能向前。甚至flash.utils.getTimer
也不能简单明了。还要检查您的速度是否在某个地方为负值。编辑:您应该初始化private var\u lastTime:Number=0代码>在开始游戏循环之前使用正确的值,否则会得到第一个增量作为非常奇怪的值。嗨,当我跟踪增量值时,它总是正值,并且每个循环中的var dist也是正值。
_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);
}