2 votes

AS3 supprime l'interpolation avant MOTION_FINISH via le movieclip

Je suis confronté à ce problème depuis un certain temps. J'ai une jolie petite infobulle movieclip qui suit la souris de l'utilisateur pendant quelques secondes avant de s'effacer. Mon problème est que s'il y en a déjà une, je la supprime, mais je n'arrive pas à supprimer l'événement MOTION_FINISH, qui continue de se déclencher et supprime éventuellement une nouvelle infobulle.

Ce que je veux, c'est essentiellement mettre un élément de ligne tel que var tween(smallhelp_panel).deleteAll() ; J'ai vu une fonction tweenlight killtweensof(mc) ; Cependant, j'ai utilisé les tweens que j'ai incorporés ci-dessous tout au long de mes 30k lignes de code AS3.

Voici mon gestionnaire d'infobulles. Je l'appelle avec un simple

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

Mon movieclip est un 'smallhelp_panel' et je vérifie s'il existe déjà et le supprime. Cependant, les tweens alpha et MOTION_FINISH existent toujours et causent des problèmes avec tout nouveau "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);
    }

Il s'agit de mon gestionnaire d'infobulles.

à titre de référence, mon produit d'élimination des préadolescents est le suivant :

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

et mon traqueur de souris qui déplace l'infobulle avec la souris est simple :

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

0voto

weltraumpirat Points 18030

C'est parce que vous avez ajouté votre écouteur MOTION_FINISH à la tween, et non au panneau. Vous supprimez le panneau, s'il existe déjà, mais la séquence existe toujours dans les variables tweenholder et tweenArray - et déclenche un événement MOTION_FINISH lorsque ses calculs sont terminés. Votre méthode d'écoute d'événement ne sait pas de quel tween provient l'événement et supprime correctement le panneau d'aide.

Pour remédier à ce problème, supprimez le tween et l'écouteur d'événements ainsi que le panneau d'aide dans votre fonction Main_Warning, ou modifiez le bloc de suppression dans votre méthode d'écouteur d'événements :

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

Je ne comprends pas exactement pourquoi vous auriez besoin à la fois d'une variable tweenholder et d'une variable tweenArray, cependant ;)

0voto

Prpl_Ppl_Etr Points 131

Votre TweenEvent est toujours en cours d'écoute. Vous ne supprimez jamais l'écouteur précédent, il se déclenchera donc lorsque les calculs du tween seront terminés.

Je suppose que tweenholder est déclaré quelque part au niveau mondial ? (Comme l'autre réponse ici, je suis confus quant à votre besoin de déclarer un nouveau tween, de le stocker dans une autre référence et d'ajouter cette référence à un tableau...) Si c'est le cas, essayez ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X