EnterFrame补间计算返回意外结果

时间:2010-03-02 02:18:09

标签: flash actionscript-3

我有以下代码:

protected function onEnterFrame(e:Event):void 
{
    var diff:Number;

    // position map/tree
    if (x != _targetX) {
        diff = _targetX - x; // get the difference
        x += diff * 0.2; // tween x position
        diff = diff < 0 ? -diff : diff; // get absolute value
        if (diff < 0.05) {
            x = _targetX;
        }
    }
}

我将_targetX设置为我的应用中的两个值之一:0-1360。当我将它设置为0时,补间执行正如您所期望的那样。当我将它设置为-1360时,会发生奇怪的事情......补间会按照您的预期执行,直到最后一点。 x到达-1359.8并且差异达到0.20000000000004547,此时它就会停止。 x不再接近_targetX而且这些值只是暂停。他们不会让步。因此,if (diff < 0.05)条件永远不会计算为true,并且补间逻辑将继续无限期地执行。

我猜它与浮点精度有关,但我不确定解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

正如您所说,浮点精度可能会有问题。我只是将您的代码放入一个空的Flash项目中,只使用变量而不是任何实际对象的位置属性,并且您的代码工作正常 - 差异达到小于0.05的数字并且代码停止执行。

然后我尝试在舞台上使用一个对象,并使用它的x值,然后遇到了你描述的问题。一个简单的解决方案似乎是使用Number类型的对象来进行计算,然后在语句结束时将对象的x值设置为等于变量。我已粘贴下面使用的代码,其中'box'是我放在舞台上的对象:

addEventListener(Event.ENTER_FRAME, onEnterFrame);

var someX:Number = 0;
var _targetX:Number = -1360;

function onEnterFrame(e:Event):void 
{
    var diff:Number;

    // position map/tree
    if (someX != _targetX) 
    {
        diff = _targetX - someX; // get the difference

        someX += diff * 0.2; // tween x position
        trace("diff= ", diff, " x= ", someX);

        diff = diff < 0 ? -diff : diff; // get absolute value
        //You could equally use diff = abs(diff); here

        if (diff < 0.05) 
        {
             trace("target reached; x set to targetX");
             someX = _targetX;
        }
        box.x = someX;
    }
}

我希望有所帮助。