2011-12-17 52 views
2

我一直在摸索這個問題。我有一個可愛的小工具提示動畫片段,它會在用戶的鼠標移除之前持續幾秒鐘。我的問題是,如果已經有一個我刪除它,但是,我似乎無法刪除MOTION_FINISH事件,它仍然會觸發並可能刪除新的工具提示。AS3通過動畫剪輯在MOTION_FINISH之前移除補間

我想要的是本質上放入一個行項目,如var tween(smallhelp_panel).deleteAll();我看到一個tweenlight函數killtweensof(mc);但是我已經使用了我在下面整個30k行AS3代碼中使用的補間。

這是我的工具提示處理程序。我用一個簡單的叫它

Main_Warning("Please don't forget to save!",5); 

我的movieclip是一個'smallhelp_panel',我檢查它是否已經存在並將其刪除。但是,alpha和MOTION_FINISH補間仍然存在,並會導致任何新的smallhelp_panel出現問題。

public function Main_Warning(the_text:String, myTimer:int = 4){ 
     if(smallhelp_panel != null){ 
       stage.removeChild(smallhelp_panel); 
       removeEventListener(Event.ENTER_FRAME, trackmouse); 
       smallhelp_panel = null; 
      } 
     smallhelp_panel = new small_help(); 
     smallhelp_panel.name = "myWarning"; 
     smallhelp_panel.x = mouseX - 50; 
     smallhelp_panel.y = mouseY + 15; 
     smallhelp_panel.helptext.text = the_text; 
     stage.addChild(smallhelp_panel); 
     addEventListener(Event.ENTER_FRAME, trackmouse); 
     var myTween:Tween; 

     myTween = new Tween(smallhelp_panel, "alpha", None.easeOut, 1, 0, myTimer, true); 
     tweenholder = myTween; 
     tweenArray.push(tweenholder); 
     myTween.addEventListener(TweenEvent.MOTION_FINISH, removeTween); 
    } 

這是我的工具提示處理程序。供參考

我吐溫卸妝:

public function removeTween(e:TweenEvent = null):void{ 
     e.target.removeEventListener(TweenEvent.MOTION_FINISH, removeTween); 
     if(smallhelp_panel != null){ 
      removeEventListener(Event.ENTER_FRAME, trackmouse); 
      stage.removeChild(smallhelp_panel); 
      smallhelp_panel = null; 
     } 
    } 

和我的鼠標跟蹤器與鼠標移動的工具提示是一個簡單的:

public function trackmouse(e:Event):void{ 
     smallhelp_panel.x = mouseX - 50; 
     smallhelp_panel.y = mouseY + 15; 
    } 

回答

0

那是因爲您已加入MOTION_FINISH事件傾聽補間,而不是面板。如果已經存在一個面板,但是該面板仍然存在於tweenholder和tweenArray變量中,並且在計算完成時觸發MOTION_FINISH事件,則可以移除該面板。您的事件偵聽器方法不知道事件來自哪個補間,並正確刪除幫助面板。

爲了解決這個問題,或者與幫助面板在Main_Warning功能刪除吐溫和事件監聽器一起,或修改除去區塊在你的事件偵聽器方法:

public function removeTween(e:TweenEvent = null):void{ 
    e.target.removeEventListener(TweenEvent.MOTION_FINISH, removeTween); 
    // --- this will check if the Tween belongs to the panel on the stage! 
    if (smallhelp_panel && e.target.obj == smallhelp_panel) { 
    // --- 
     removeEventListener(Event.ENTER_FRAME, trackmouse); 
     stage.removeChild(smallhelp_panel); 
     smallhelp_panel = null; 
    } 
    // --- NOW remove the tween from the array (all of them should be removed after use) 
    tweenArray.splice (tweenArray.indexOf (e.target), 1); 
} 

我不明白究竟爲什麼您將需要一個tweenholder和一個tweenArray變量,儘管;)

+0

我嘗試了這一點,並完美的作品。 我的問題有一段時間,我的補間被垃圾收集,我試圖使用對象和持有人。該對象適用於我只有一個補間的場合,但添加了多個我發現我需要一個數組。所以我的理由是如果對象工作,將該對象放入數組將存儲它。 這是一個初學者的錯誤,通過。但是,當我退出某個部分時,我會清除數組和對象以釋放這些資源。 這工作就像一個魅力,我不能說謝謝你。 – 2011-12-17 01:42:21

+0

曾經很多:)不客氣。我可能會建議,爲了將來,您可以使用TweenLite/TweenMax(http://www.greensock。com/greenlite /)還是另一個補間庫?他們通常表現比fl.transition更好.Tween更容易管理,並且還帶有一個方便的API。 – weltraumpirat 2011-12-17 07:57:58

0

您的TweenEvent仍在偵聽。您永遠不會刪除先前的偵聽器,因此它會在補間計算完成時觸發。

我認爲tweenholder被聲明在某個地方的全球? (喜歡這裏的其他答案,我很困惑,你宣佈一個新補,其存儲在另一個參考,並補充說,引用數組...的需要)如果是的話,試試這個:

public function Main_Warning(the_text:String, myTimer:int = 4){ 
    tweenholder.removeEventListener(TweenEvent.MOTION_FINISH,removeTween); 
    if(smallhelp_panel != null){ 
     ...