帧平滑代码

3

好的,这可能是我对ActionScript不理解的基础知识,但我似乎在这方面一无所获。

我有一些代码,应该可以平滑地处理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);

因此,可以看到,我正在计算帧之间的时间差,并将其乘以速度常数。我得出一个数字值并将其追踪到输出窗口。它在0.14和0.19之间波动,平均为0.18。
如果我使用该值偏移时钟指针MC的旋转,则永远不会移动。如果像上面显示的那样使用常数0.18,则大约每30秒旋转一次。
因此,它们都是数字类型,并且跟踪显示它们的值大致相同。为什么一个能够移动MC而另一个不能呢?
感谢任何建议!

听起来你遇到了一些整数转换错误。你可以尝试将 private var clock_speed:Number = 5; 更改为 private var clock_speed:Number = 5.0; 吗? - Jonatan Hedborg
2个回答

3
在您的第一次循环中,第一次计算deltaTime会导致this.m_lastTime为空而得到NaN。从那里开始,您的代码试图增加一个不是数字的对象。一个简单的解决方案是在声明变量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);

啊,好的。你的意思是第一次通过循环,m_lastTime为空,这使得deltaTime成为NaN,然后当我将其加到旋转中时,它变成了NaN?那么下一次通过循环时,即使m_lastTime现在是一个实数,因此deltaTime现在是一个实数,由于NaN + 5 == NaN,旋转始终会是NaN?是这样吗? - LoveMeSomeCode
基本上是这样的。NaN 可能会很棘手,因为它是 Number 的一个有效值,不会抛出错误。但是,它仍然可能在应用程序中引起意外行为。 - Corey

1

在第一次使用 m_lastTime 时,您没有为其设置初始值。如果在声明变量时初始化它,var m_lastTime:Number = getTimer(); 就可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接