好的,这可能是我对动作脚本不了解的一些基本内容,但我似乎无法随心所欲。
我有一些代码可以在ENTER_FRAME循环中平滑动画:
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);
正如您所看到的,我正在计算帧之间的时间差,并将其乘以速度常数。我想出一个Number值并将其跟踪到输出窗口。它在0.14和0.19之间波动,平均为0.18。
如果我使用该值来抵消钟表MC的旋转,它永远不会移动。 如果我使用如上所示的常数0.18,它将以每30秒大约1转的速度向右移动。
所以它们都是数字类型,跟踪显示它们的值大致相同。为什么一个人能够移动MC而另一个不能移动?
感谢您的任何建议!
答案 0 :(得分:3)
在第一次循环中,deltaTime
的第一次计算会导致NaN
,因为this.m_lastTime
为空。从那里,您的代码正在尝试增加一个不是数字的Object。一个简单的解决方案是在声明它时将 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);
答案 1 :(得分:1)
首次使用时,m_lastTime
没有初始值。如果在声明var时初始化var,var m_lastTime:Number = getTimer();
就可以了。