帧平滑代码

时间:2011-12-07 14:43:10

标签: actionscript-3 animation

好的,这可能是我对动作脚本不了解的一些基本内容,但我似乎无法随心所欲。

我有一些代码可以在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而另一个不能移动?

感谢您的任何建议!

2 个答案:

答案 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();就可以了。