Actionscript 3 帧平滑码
好吧,这可能是关于actionscript我不了解的一些非常基本的东西,但我似乎无法用它取得任何进展 我有一些代码可以在ENTER_FRAME循环中平滑动画:Actionscript 3 帧平滑码,actionscript-3,animation,Actionscript 3,Animation,好吧,这可能是关于actionscript我不了解的一些非常基本的东西,但我似乎无法用它取得任何进展 我有一些代码可以在ENTER_FRAME循环中平滑动画: private var m_lastTime:Number; private var clock_speed:Number = 5; private function frameLoop(evt:Event):void { var currTime:int = getTimer(); va
private var m_lastTime:Number;
private var clock_speed:Number = 5;
private function frameLoop(evt:Event):void
{
var currTime:int = getTimer();
var deltaTime:Number = ( currTime - this.m_lastTime ) * 0.001;
this.m_lastTime = currTime;
//trace(deltaTime.toString() + "," + (deltaTime * clock_speed).toString());
// why you no work?
var n:Number = clock_speed * deltaTime;
trace(n);
mcClockHand.rotation += .18;// Number(deltaTime * clock_speed);
如你所见,我在计算帧间的时间差,然后乘以一个速度常数。我得到一个数值,并将其跟踪到输出窗口。它在0.14和0.19之间波动,平均值为0.18
如果我用这个值来抵消钟手MC的旋转,它永远不会移动。
如上图所示,如果我使用常数0.18,它将以大约每30秒旋转1圈的速度向右移动
所以它们都是数字类型,跟踪显示它们的值大致相同。为什么一个能移动MC而另一个不能
谢谢你的建议 首次使用时,
m\u lastTime
没有初始值。如果在声明var时初始化它,var m_lastTime:Number=getTimer()
它可以工作。在第一个循环中,deltaTime
的第一次计算结果是NaN
,因为this.m_lastTime
为空。从这里开始,您的代码尝试递增一个不是数字的对象。一个简单的解决方案是在声明时将m_lastTime
变量设置为0
:
private var m_lastTime:Number = 0;
更好的解决方案是在计算结果为NaN时检查案例
var n:Number = clock_speed * deltaTime;
if (isNaN(n)) n = 0;
trace(n);
mcClockHand.rotation += n;// Number(deltaTime * clock_speed);
听起来好像您遇到了一些int转换错误。你能试着改变
private-var-clock\u-speed:Number=5代码>至专用var时钟速度:数字=5.0代码>?啊,好的。你是说第一次通过循环时,m_lastTime为null,这使得deltaTime为NaN,然后当我把它加到旋转时,它变成NaN?所以下一次通过循环,即使m_lastTime现在是实数,因此deltaTime现在是实数,旋转将始终是NaN,因为NaN+5==NaN?是吗?差不多。NaN可能很棘手,因为它是数字的有效值,不会抛出错误。但是,它仍然可能导致应用程序中出现意外行为。