我有以下代码:
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,并且补间逻辑将继续无限期地执行。
我猜它与浮点精度有关,但我不确定解决方案。有什么想法吗?
答案 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;
}
}
我希望有所帮助。