2009-12-21 57 views
1

我想模仿我正在開發的Flash應用程序中的iPhone滾動行爲。這個想法是使拖放具有一定的慣性/減速度(你知道,當你在光標移動時放下某物並且物體會繼續移動片刻然後停止)。flash as3慣性拖拽

我爲我的動畫使用TweenMax庫。

任何想法將不勝感激。

感謝

回答

3

當我最近創建了這樣的事情,我只是聽了MOUSE_DOWN和MOUSE_UP,每當我估摸出鼠標按鈕被按下(即在中間的兩個事件,也尊重Event.MOUSE_LEAVE)我會標記它,例如使用_mouseIsDown類範圍變量。

然後,我會有一個ENTER_FRAME事件處理程序或計時器,根據是否按下按鈕,其行爲會有所不同。

當鼠標按鈕關閉時,ENTER_FRAME處理程序只是將目標對象移動到新的鼠標位置。它還會從前一箇中減去當前的鼠標位置,以獲得速度向量。最後,它會記錄當前的鼠標位置,以允許上述情況再次發生在下一幀。

但是,如果釋放鼠標按鈕,它不會僅使用1:1映射將鼠標位置移動到目標對象,而是根據速度向量移動它。它也會減少速度向量的長度,直到它接近於零,整個系統纔會進入空閒狀態以節省資源。

一個簡化的解決方案看起來像這樣,忽略mouseIsDown標誌的設置和重置。

private function _handleEnterFrame(ev : Event) : void 
{ 
    if (_mouseIsDown) { 
    // Set speed here, but don't use it while mouse is pressed 
    _speed.x = stage.mouseX - _prev_mouse_pos.x; 
    _speed.y = stage.mouseY - _prev_mouse_pos.y; 

    // Instead, just move target object accordingly 
    _targetObject.x = stage.mouseX; 
    _targetObject.y = stage.mouseY; 
    } 
    else { 
    // Mouse is released, meaning that it has been tossed, so move 
    // object according to speed vector, and decrease speed. 
    _targetObject.x += _speed.x; 
    _targetObject.y += _speed.y; 

    _speed.x *= 0.8; 
    _speed.y *= 0.8; 


    // Negligible speed, so stop the processing to save resources 
    if (_speed.length < 0.05) { 
     this.removeEventListener(Event.ENTER_FRAME, _handleEnterFrame); 
    } 
    } 

    _prev_mouse_pos.x = stage.mouseX; 
    _prev_mouse_pos.y = stage.mouseY; 
} 

顯然,無論何時按下鼠標,您都需要開始監聽ENTER_FRAME事件。此外,您需要具有相應的類作用域變量_prev_mouse_pos和_speed,這兩個flash.geom.Point實例以及_targetObject是您希望通過拖動影響的任何顯示對象。

+0

謝謝......將調查此 – mga 2009-12-22 00:18:36

+0

它的作品足夠好。你提到的矢量對象不適合我(_speed:Vector?)。我只用了x因爲它是無維的。我使用mouse_move並設置了一些端點和一個補間,但切換到這種方法。 – mga 2009-12-23 22:53:41

+0

你會如何去指數/二次方便? – mga 2009-12-23 22:54:11