AS3通过movieclip删除MOTION_FINISH之前的补间

时间:2011-12-17 00:12:44

标签: actionscript-3 tween

我一直在摸索这个问题。我有一个可爱的小工具提示动画片段跟随用户的鼠标几秒钟后才会自动删除。我的问题是,如果已经有一个我删除它,但是,我似乎无法删除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_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;
        }
    }

我用鼠标移动工具提示的鼠标跟踪器很简单:

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

2 个答案:

答案 0 :(得分: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变量,但是;)

答案 1 :(得分:0)

您的TweenEvent仍在收听中。您永远不会删除上一个侦听器,因此它将在补间计算完成时触发。

我认为tweenholder是在全球范围内宣布的吗? (就像这里的另一个答案一样,我很困惑你需要声明一个新的补间,将它存储在另一个引用中并将该引用添加到数组中......)如果是这样,试试这个:

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