2010-03-02 39 views
0

我有下面的代碼位:enterFrame事件吐溫計算返回意外結果

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)條件從不計算爲真,並且補間邏輯繼續無限期地執行。

我猜它與浮點精度有關,但我不確定是否有解決方案。有任何想法嗎?

回答

2

正如您所說,浮點精度可能會造成問題。我只是把你的代碼放到一個空的Flash項目中,只使用變量而不是任何實際對象的位置屬性,並且你的代碼工作的很好 - diff達到小於0.05的數字並且代碼停止執行。

然後,我試着用舞臺上的一個物體,並使用它的x值,並跑到你描述的問題。一個簡單的解決方案似乎是使用Number類型的對象來執行計算,然後在語句結束時將對象的x值設置爲等於變量。我貼我下面使用的代碼,其中的「盒子」是我把舞臺上的對象:

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; 
    } 
} 

我希望幫助。

+0

謝謝debu!你的解決方案的確可行現在我想知道*爲什麼* :) – heavilyinvolved 2010-03-02 04:39:13

+0

沒問題,很高興它幫助!看起來像另一個人張貼了一個原因,所以都清除了:) – debu 2010-03-02 04:51:53