2010-11-08 89 views
0

我創建了一個movieclip spawner類和animator類,它沿着一組x,y點動畫片段。我已經使用了Greensock的TweenMax來完成動畫,並且我已經將速度設置爲每個點之間1秒。問題是,當兩點之間的距離很小時,看起來太慢了。FLash AS3 - 如何表示兩個xy座標之間的差值,作爲介於0和1之間的數字?

我想要做的是以某種方式計算兩點之間的距離並輸出0到1秒範圍內的速度,以便速度對於較短的距離以及較長的距離是正確的。

任何幫助或建議將不勝感激。

三江源,

eb_dev

+1

'nX-nY/oX-oY'會讓你的係數在0和1之間,其中'oX'和'oY'是你期望得到1的座標,'nX'和'nY'是需要速度值小於1的新座標。 – soulseekah 2010-11-08 10:43:29

+0

感謝您的回覆soulseekah,我無法使用上面的信息處理它,不幸的是我認爲我已經通過Matti的回答正常工作。 – 2010-11-08 14:58:14

回答

1

我第二什麼馬蒂說,但它可以變得更快 - 對於內存約48至64位的成本(哇這麼多!!! ...)

var dX:Number = x1 - x2; 
var dY:Number = y1 - y2; 
var dist:Number = Math.sqrt(dX * dX + dY * dY); 
var animTime = dist/state.stageWidth; 

而對於解釋上EB開發的要求,平方根有勾股定理的一部分:X上

a^2 + b^2 = c^2 

線和Y軸可以被看作是一個直角三角形的兩條腿,以及因此斜邊將是di兩個特定點之間的立場(我們需要)。

首先我們減去點(x1 - x2,y1 - y2)。我們仍然有兩個點,但是,三角形的直角部分現在位於0,0 - X和Y軸交叉的點。爲了能夠將其應用到畢達哥拉斯定理,讓我們看看大小一個b將是 - 腿一個的長度爲0之間的距離,0和點1.減去0,0仍然會留給我們第1點 - 但是,我們知道它將位於X軸的某個位置 - 因此它的Y將會是0.我們可以說長度爲a等於第1點的X部分。

同樣爲b leg and point 2.然而這一次,我們只得到了它的一部分。

並計算Ç,我們將首先總結的一個b(A^2 + B^2)所述第二功率。我們現在有c^2,所以爲了得到斜邊,我們將計算它的平方根(即AS3.0中的Math.sqrt())。

c是距離。

希望這解釋了這一點。

+0

謝謝Aurel300,這個解釋讓它更清晰。現在我可以想象這些數字如何與xy點相關。 – 2010-11-10 10:05:13

1

你想要做的是計算兩個點之間的距離,並有足夠的時間相對於這一點。你如何定義關係取決於。是一秒鐘的動畫,其中的東西從舞臺的一端移動到另一端或什麼。這將成爲您的基準,所有動畫都將與其相關。

所以我們假設整個舞臺寬度的動畫是一秒鐘,比這短1秒鐘。

dist = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
animTime = dist/state.stageWidth; 

UPDATE: 的Math.sqrt只是需要的點之間的差的平方根。你不一定需要這樣做,因爲你只關心相對於舞臺大小的距離而不是實際的距離。它的原因是爲了回到與stage.stageSize相同的比例。請注意0​​正在平方x1x2座標之間的距離,即。等於Math.pow(x1-x2,2)

+0

您好,感謝您的回覆,我實施了您的配方,結果比以前好得多。你能解釋一下sqrt函數的用法嗎?謝謝。 – 2010-11-08 15:11:15

+0

@eb_Dev:看到更新 – 2010-11-09 18:31:14

+0

感謝馬蒂,我對現在發生的事情有了更好的把握。如果我還有其他問題,我會回信。 – 2010-11-10 10:27:55

1

我認爲你想要更小的距離的最小速度。

const MIN_SPEED:Number = ???// adjust this value 
var distance:Number = Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 
var duration:Number = Math.min(1.0, distance/MIN_SPEED); 

長距離1.0 <距離/ MIN_SPEED,和持續時間將被設置爲1.0 [秒]
爲小的距離1.0>距離/ MIN_SPEED,和持續時間將被設置爲在由MIN_SPEED定義的一些的速度移動。

相關問題