2011-12-17 11 views
2

私はこの問題をちょっと疑問に思っています。私はそれを削除する前に数秒間、ユーザーのマウスに続く素敵な小さなツールチップムービークリップを持っています。私の問題は、既にそこに1つがある場合、それを削除しますが、私はMOTION_FINISHイベントを削除したように見えず、まだ起動し、おそらく新しいツールチップを削除するということです。ムービークリップを使用してMOTION_FINISHの前にAS3トゥイーンを削除します

私は、基本的にvar tween(smallhelp_panel).deleteAll();などの広告申込情報に入れたいと思っています。 私はtweenlight関数killtweensof(mc)を見た。しかし私は、私が30k行のAS3コードで以下に取り上げたトゥイーンを使用しました。

ここに私のツールチップハンドラがあります。私は私のムービークリップは、「smallhelp_panel」で、私はそれが既に存在するかどうかを確認し、それを削除

シンプル

Main_Warning("Please don't forget to save!",5); 
でそれを呼び出します。ただし、alphaおよびMOTION_FINISHのトゥイーンはまだ存在し、新しいsmallhelp_panelsに問題を引き起こします。

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

と私のマウストラッカーは単純です:あなたはMOTION_FINISHイベント追加したためだ

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

答えて

0

パネルにではなく、トゥイーンへのリスナー。パネルがすでに存在する場合はそれを削除しますが、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); 
} 

私は理由を正確に理解していませんtweenArray変数とtweenArray変数の両方が必要です;)

+0

Iこれを試してみると完璧に動作します。 私はトゥイーンがガベージコレクションされている間に問題が発生し、オブジェクトとホルダーを使って試しました。このオブジェクトは、1つのトゥイーンしか存在しないインスタンスのために機能しましたが、複数を追加すると、配列が必要であることがわかりました。だから、私の理論的根拠は、オブジェクトが機能していれば、そのオブジェクトを配列に格納することであった。 初心者の間違いだった。しかし、セクションを終了すると、配列とオブジェクトをクリアしてそれらのリソースを解放します。 これは魅力的なように機能し、十分にありがとうとは言えません。 –

+0

一度は十分です:)あなたは大歓迎です。将来的にはTweenLite/TweenMax(http://www.greensock)を使用することをお勧めします。com/greenlite /)または別のトゥイーンライブラリ?彼らは通常fl.transitions.Tweenよりもはるかに優れた性能を発揮し、管理が容易であり、便利なAPIも提供されます。 – weltraumpirat

+0

私はおそらく将来のプロジェクトのためになります。私はそれについて考えていましたが、あなたが振り返ってみると、どれくらいのコードを取り除かなければならないのかを見てみると、そのような作業の引き受けはあまりにも負担になります。しかし私はそれを将来のプロジェクトで使用します。 –

0

あなたのTweenEventは依然としてリッスンされています。前のリスナーは削除されないため、トゥイーンの計算が完了すると起動します。

tweenholderはどこかでグローバルに宣言されていると仮定しますか?他の答えと同じように、私は新しいトゥイーンを宣言し、別のリファレンスに格納し、配列にそのリファレンスを追加する必要があると混同しています...)そうなら、これを試してください:

+0

私もこれを試してみましたが、それは私が経験していた問題を解決するのにも大いに役立ちます。だから両方のソリューションは私の経験ではうまく動作します。私はtweenholderを参照し、それを掘り出す必要があるかもしれないと思っていた。しかし、私はあなたが概説したようにそれが簡単だったことを知らなかった。 ありがとう、 –

関連する問題