Forums Développement Multimédia

Aller au contenu

removeChild - addChild - visible = false;

CODE Actionscript

4 réponses à ce sujet

#1 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 06 August 2013 - 13:23 PM

Bonjour,

Je débute en AS3, merci d'avance pour votre aide.

Je souhaite savoir comment procéder pour gérer l'affichage et la suppression (sur la scène) d'une même occurrence dans différentes fonction et différent écouteur d’événement.

Avec

removeChild(monoccurence);

j'ai souvent des erreurs, il semble qu'on ne puisse pas procéder ainsi pour supprimez une occurrence ailleurs que dans la fonction qui l'a crée ( avec addChild)

Alors j'ai bien trouvé comment faire avec :

monoccurence.visible = false;

Mais je me dit que cela alourdit le programme puisque l’occurrence est seulement masqué.

Que faire ?

Merci de vos explications !

Phil

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 06 August 2013 - 14:41 PM

Bonjour et bienvenue,

Citation

Je souhaite savoir comment procéder pour gérer l'affichage et la suppression (sur la scène) d'une même occurrence dans différentes fonction et différent écouteur d’événement.

Peux-tu préciser ce que tu entends par "une même occurence" ?

Chaque DisplayObject (clip, sprite, scene) dans Flash possède une liste d'affichage.

Lorsque tu veux ajouter un objet à une liste d'affichage tu utilise la syntaxe : addChild(monObjet).
Si tu veux ajouter un objet à la liste d'affichage d'un DisplayObject spécifique tu utilise la syntaxe : monDisplayObject.addChild(monObjet);

Pour retirer un objet d'une liste d'affichage tu utilise la syntaxe : removeChild(monObjet);
Pour cibler la liste d'affichage d'un DisplayObject spécifique tu utilise la syntaxe : monDisplayObject.removeChild(monObjet);

Si tu ne sais pas quel est le DisplayObject où ton objet à été créé, tu peux utiliser la syntaxe : monObjet.parent.removeChild(monObjet);
La syntaxe 'parent' permet de remonter l'arborescence de un niveau, donc de trouver le parent d'un objet.

#3 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 06 August 2013 - 16:13 PM

Bonjour,

Merci de ta réponse.
voici un exemple concret de code que je souhaite exécuter et qui retourne une erreur :

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.


Le code :

addEventListener(Event.ENTER_FRAME, compatibiliseLesPouvoirs);

function compatibiliseLesPouvoirs(evt:Event)
{

if (pouvoir == 1)

{


addChild(pouvoirplusun) ;   // l’occurrence d'un symbole graphique qui pop à l’écran pour monter qu'on à gagner un pouvoir.

pouvoirplusun.x = 639,85 ;       // son positionnement en x
pouvoirplusun.y = 371,55 ;      // son positionnement en y

TweenMax.to(pouvoirplusun, 1, {scaleX:1.3, scaleY:1.3, x: 364.15, y: 67.90, alpha:0}); // anim l’occurrence qui grossit puis disparaît.


setTimeout(effaceoccurence, 800);          //pour effacer l’occurrence au bout de la durée indiquée

                function effaceoccurence():void {

removeChild(pouvoirplusun);                    

        }


}


Je n'ai sans doute pas bien compris le rôle de addChild et removeChild, quoi qu'il en soit, "je ne souhaite pas ajouter un objet à une liste d'affichage" mais à afficher l’occurrence d'un symbole sur la scène et à la dégager à un autre moment, dans un autre fonction

Merci pour les explications

#4 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 06 August 2013 - 17:08 PM

Re,

Merci d'utiliser les balises de code pour entourer et mettre en forme ton code dans tes messages.

Citation

afficher l’occurrence d'un symbole sur la scène
Cela revient à "ajouter un objet à la liste d'affichage de la scène", la scène étant elle même considérée comme un DisplayObject (objet d'affichage) ayant une DisplayList (liste d'affichage) Image IPB

Pour la gestion des listes d'affichage je te recommande de lire ceci :http://forums.mediab...19#entry1152719

Revenons à ton code, plusieurs choses ne vont pas, déjà tu as des fonctions imbriquées et ça c'est pas bien...
Mais je pense que ton problème vient de là :


//pour effacer l’occurrence au bout de la durée indiquée
setTimeout(effaceoccurence, 800);              

function effaceoccurence():void {
        removeChild(pouvoirplusun);                                    
}
 

La doc dit ceci pour le setTimeout :

Citation

Exécute une fonction spécifiée après un délai défini (exprimé en millisecondes).
Au lieu d’utiliser cette méthode, envisagez de créer un objet Timer associé à l’intervalle spécifié, en utilisant 1 en tant que paramètre repeatCount (qui règle l’horloge pour qu’elle ne s’exécute qu’une seule fois).

Donc déjà il est recommandé d'utiliser un Timer Image IPB

Dans un nouveau projet vierge qui nous servira de tests, essayes de coller uniquement ce petit bout de code et regarde ce que te sort la console :


var pouvoirplusun:MovieClip = new MovieClip();
var pouvoir:int = 1;

addEventListener(Event.ENTER_FRAME, compatibiliseLesPouvoirs);

function compatibiliseLesPouvoirs(e:Event){
        if (pouvoir == 1){
                trace("ajoute a : "+this.parent);
                trace("Nombre d'objets : "+stage.numChildren)
                addChild(pouvoirplusun) ;  
                pouvoirplusun.x = 639,85 ;
                pouvoirplusun.y = 371,55 ;
                setTimeout(effaceoccurence, 800);
        }
}

function effaceoccurence():void {
        trace("efface depuis : "+this.parent);
        removeChild(pouvoirplusun);                                    
}
 

Ça tourne en boucle et à un moment donné tu tombe sur une erreur #2025.

Si tu modifie juste ça :


function compatibiliseLesPouvoirs(e:Event){
        if (pouvoir == 1){
         pouvoir = 0;
         // ... la suite de ton code

 

Tu n'as plus d'erreur puisque la fonction n'est appelée qu'une seule fois et là tout se passe bien.
Première solution, penser à modifier la variable "pouvoir" pour éviter une boucle.
Mais voyons pourquoi en boucle ça plante...

Voici la série d'infos que la console nous renvoie au bout d'un moment :

Citation

ajoute a : [object Stage]
Nombre d'objets : 1
efface depuis : [object Stage]
ajoute a : [object Stage]
Nombre d'objets : 1
efface depuis : [object Stage]
efface depuis : [object Stage]
ArgumentError: Error #2025: Le DisplayObject indiqué doit être un enfant de l'appelant.

Tout se passe bien jusqu'à ce que la fonction "effaceoccurence" soit lue deux fois sans repasser par la case "compatibiliseLesPouvoirs" puisque rien n'est renvoyé à la console à ce moment là. Tout de suite derrière tu as une erreur car il ne trouve pas l'objet que tu souhaite effacer dans la liste d'affichage.

La vraie question qui se pose c'est, pourquoi cette fonction est lue deux fois de suite alors qu'elle est normalement appelée à chaque fois qu'on crée un nouveau "pouvoirplusun" ? On devrait avoir exactement le même nombre de fois un ajout et un retrait.

La seule réponse que je vois c'est la différence entre :

addEventListener(Event.ENTER_FRAME, compatibiliseLesPouvoirs);

et

setTimeout(effaceoccurence, 800);

Le premier est un écouteur qui tourne à la vitesse du projet, le second est un timer qui tourne à 800 millisecondes.
Les deux ne sont pas calés, le timer n'a pas encore fini son décompte alors que l'écouteur à déjà créé le nouvel objet, du coup deux timers sont lancés pour effacer un seul objet, le premier fait bien son office mais le second ne trouve pas l'objet à dégager puisque le premier vient de le faire.

Résumons, soit tu n'as besoin de cette fonction qu'une fois et dans ce cas tu dois modifier la variable "pouvoir" en conséquence pour éviter une boucle. Soit tu dois t'en servir en boucle, et dans ce cas tu dois corriger les erreurs de synchronisation entre l'écouteur principal et le timer, voire trouver une autre solution pour supprimer ton objet.

Bon courage.

#5 philippeonline

    Ceinture Marron

  • Members
  • PipPipPipPipPipPip
  • 102 messages

Posté 08 August 2013 - 09:39 AM

merci pour ta réponse



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP