If child exist: Remove child

MisterSnow Messages postés 18 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 24 janvier 2010 - 22 janv. 2010 à 00:38
astrolabbcracker Messages postés 106 Date d'inscription mardi 11 janvier 2005 Statut Membre Dernière intervention 11 juin 2012 - 11 juin 2012 à 22:24
Bonjour,

Je suis coincé sur un problème qui est surrement très simple à résoudre.
Comme le dis le titre, je cherche la ligne de code qui me permettera, lorsque je clic sur un bouton, de supprimer un "child" à condition que celui-ci soit présent et d'en charger un nouveau à la place.

Forcément j'avais commencé par dérouler les lignes de code du type:
acces_btn.addEventListener(MouseEvent.CLICK, function(){
removeChild(ancienChild1);
removeChild(ancienChild2);
removeChild(ancienChild3);
etc..
addChild(nouveauChild);
};

Mais forcément vu que les child n'étaient pas forcément présent flash me spécifiait qu'il était impossible de supprimer un élément null et ça finissait par buguer.

Alors j'ai fait des recherches sur le net et essayé 2 ou 3 choses du genre:
acces_btn.addEventListener(MouseEvent.CLICK, function(){
if(ancienChild1 != null){removeChild(ancienChild1);
if(ancienChild2 != null){removeChild(ancienChild2);
if(ancienChild3 != null){removeChild(ancienChild3);
addChild(nouveauChild);
};

ou encore :
acces_btn.addEventListener(MouseEvent.CLICK, function(){
if (this.numChildren>0) {
this.removeChild();    }
else {addChild(nouveauChild)};


A chaque fois le script ne comporte aucune erreur mais quand je publie ça ne maarche pas.
Les children ne sont pas supprimés et s'empilent les uns sur les autres.. .

Donc voilà, qqn a une idée ?
Merci d'avance pour votre aide !
M.S

13 réponses

pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
22 janv. 2010 à 14:03
Bonjour, tu devrais te pencher sur la propriété "DisplayObjectContainer.contains".

Peg'
0
MisterSnow Messages postés 18 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 24 janvier 2010
23 janv. 2010 à 01:26
Bonjour,

Merci pour ta réponse, je viens de chercher des infos sur la propiété "DisplayObjectContainer.contains" dans la doc d'adobe.
Seulement je sais pas, ce soir je dois avoir un peu de mal.. .
Dois-je m'en servir pour déterminer si l'enfant est présent et si oui comment? Parce que l'exemple donné pour "DisplayObjectContainer.contains" ne m'aide pas... Il parle de définir plusieurs objets Sprite et d'en ajouter une partie à la liste d'enfants des autres

Bref, I need more help sur ce coup !

Merci =)
M.S
0
blunt1337 Messages postés 72 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 11 octobre 2011
23 janv. 2010 à 09:50
Salut, c'est ta facon de définir la fonction liée à l'événement Dans ton cas le 'this' pointe vers l'object Global. Essai avec ce code sur la frame ou se trouve les 'ancienChildN' :

acces_btn.addEventListener(MouseEvent.CLICK, onClick);
function onClick(e:MouseEvent):void
{
//efface
if (ancienChild1)
removeChild(ancienChild1);
//ajoute
addChild(nouveauChild);
}
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
23 janv. 2010 à 11:17
@blunt1337 : quoiqu'il en soit "if(monObjet)" ne définiras pas le fait qu'il soit affiché mais son instanciation sous cette référence. Son "existence" en quelques sortes.

@MisterSnow : Pour savoir si liste d'affichage d'un displayObjectContainer contiens le displayObject désiré, il suffit de faire "monContainer.contains(monDisplayObject)" et ça renvoie un booléen. Si c'est vrai, alors il est affichén sinon, non ...
Où est-ce que tu patauges ?

Peg'
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MisterSnow Messages postés 18 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 24 janvier 2010
23 janv. 2010 à 18:29
@blunt : j'ai essayé avec ta méthode mais ça ne marche pas pourtant j'ai bien mis le code sur la frame où sont appelés les différents child.

Pour etre plus clair, ma page index comporte 3 frames:
- un preloader sur la 1ere
- une page d'accueil avec une anim et un bouton 'gotoAndstop(3)' sur la 2eme
- le gros du site où sont appelés ou effacé les swf exterieurs (child) sur la frame 3

Voici le code de ma 3eme frame à l'heure actuelle (qui ne fonctionne pas):
stop();
import com.greensock.*;
import com.greensock.plugins.*;
TweenPlugin.activate([BlurFilterPlugin]);
import flash.display.Sprite;

var stuRequest:URLRequest = new URLRequest("studio.swf"); 
var stuLoader:Loader = new Loader();
var realRequest:URLRequest = new URLRequest("real.swf"); 
var realLoader:Loader = new Loader();
var eventRequest:URLRequest = new URLRequest("event.swf"); 
var eventLoader:Loader = new Loader();

//animation des boutons et de l'image de fond à l'arrivée sur la frame 3
TweenLite.to(fond_mc, 2, {alpha:1});
TweenLite.from(studio_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(real_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(event_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(coll_btn,0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(dd_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(acces_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(news_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});
TweenLite.from(contact_btn, 0.5, {scaleX:0, scaleY:1, blurFilter:{blurX:20}});

studio_btn.addEventListener(MouseEvent.CLICK, function(){

if (realLoader)
removeChild(realLoader);
if (eventLoader)
removeChild(eventLoader);	
else {	
TweenLite.to(fond_mc, 1, {x:580, y:385}), 
TweenLite.to(studio_btn, 1, {x:235, y:260});
TweenLite.to(real_btn, 1, {x:50, y:60});
TweenLite.to(event_btn, 1, {x:50, y:160});
TweenLite.to(coll_btn, 1, {x:50, y:260});
TweenLite.to(dd_btn, 1, {x:50, y:360});
TweenLite.to(acces_btn, 1, {x:50, y:460});
TweenLite.to(news_btn, 1, {x:50, y:560});
TweenLite.to(contact_btn, 1, {x:50, y:660});
stuLoader.load(stuRequest); 
addChild(stuLoader);
}	
});





real_btn.addEventListener(MouseEvent.CLICK, function(){

if (stuLoader)
removeChild(stuLoader);
if (eventLoader)
removeChild(eventLoader);

else {
TweenLite.to(fond_mc, 1, {x:580, y:385}), 
TweenLite.to(real_btn, 1, {x:235, y:260});
TweenLite.to(studio_btn, 1, {x:50, y:60});
TweenLite.to(event_btn, 1, {x:50, y:160});
TweenLite.to(coll_btn, 1, {x:50, y:260});
TweenLite.to(dd_btn, 1, {x:50, y:360});
TweenLite.to(acces_btn, 1, {x:50, y:460});
TweenLite.to(news_btn, 1, {x:50, y:560});
TweenLite.to(contact_btn, 1, {x:50, y:660});	
realLoader.load(realRequest); 
addChild(realLoader);	
}
});




event_btn.addEventListener(MouseEvent.CLICK, function(){

if (realLoader)
removeChild(realLoader);

if (stuLoader)
removeChild(stuLoader);
else {
TweenLite.to(fond_mc, 1, {x:580, y:385}), 
TweenLite.to(event_btn, 1, {x:235, y:260});
TweenLite.to(studio_btn, 1, {x:50, y:60});
TweenLite.to(real_btn, 1, {x:50, y:160});
TweenLite.to(coll_btn, 1, {x:50, y:260});
TweenLite.to(dd_btn, 1, {x:50, y:360});
TweenLite.to(acces_btn, 1, {x:50, y:460});
TweenLite.to(news_btn, 1, {x:50, y:560});
TweenLite.to(contact_btn, 1, {x:50, y:660});	
eventLoader.load(eventRequest); 
addChild(eventLoader);
}

});


@ Peg' : en fait dans ce que tu me suggère c'est la notion de "container" et de displayObject que j'ai du mal à saisir =(
Si je veux verifier si monDisplayObject est dans le container il faut paut-etre dans un 1er temps que je définisse ce qu'est le 'container'?
Concernant le displayObject, est ce que ça équivaut aux 'child' ?

Merci
M.S
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
23 janv. 2010 à 21:06
dans "this.addChild(monDisplayObject)", "this" est le container, puisque tu lui ajoutes un objet...

Peg'
0
MisterSnow Messages postés 18 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 24 janvier 2010
24 janv. 2010 à 04:11
Ok j'ai compris seulement comment je fait pour tester si mon child est dans le containeur ?
J'ai bien tenté :

this.contains(realLoader);
this.contains(stuLoader);
this.contains(realLoader)

event_btn.addEventListener(MouseEvent.CLICK, function(){

if (realLoader==true)
removeChild(realLoader);
if (stuLoader==true)
removeChild(stuLoader);
else {
addChild(eventLoader);
}

});


Mais ça ne marche pas -_-'
Pourtant si j'ai bien compris ce que tu dis Peg' les 'this.contains(monChild)' permettent de vérifier si monChild est présent dans 'this' en renvoyant un booléen donc "true" si il est présent ou "false" si il n'est pas présent, d'où le 'if(monChild==true)' dans la fonction attachée à mon bouton...

Alors voilà mon code parait une fois de plus logique comme tout ce que j'ai tenté jusqu'à maintenant et je ne comprend pas pourquoi il ne fonctionne pas...
Donc si vous savez ce qui cloche dans le pavé de code de mon message précédent ou dans le code contenu dans ce message, je suis tout ouïe et si jamais vous avez directement la solution à mon problème je suis preneur aussi. =D
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
24 janv. 2010 à 04:46
en fait, tu n'as rien compris ...
"contains" renvoie un booléen de la présence ou pas de la cible dans le container .. relis bien ton code et réfléchis.

je te la refais en français : "si realLoader est dans la liste d'affichage de l'objet où je me trouve, alors supprime-le de la liste d'affichage, sinon ajoute-le à cette liste" ...

Peg'
0
MisterSnow Messages postés 18 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 24 janvier 2010
24 janv. 2010 à 14:13
super...
bon j'ai tenté de ressaisir le truc mais bon je dois encore avoir faux puisque ça plante.

var stuRequest:URLRequest = new URLRequest("studio.swf"); 
var stuLoader:Loader = new Loader();
var realRequest:URLRequest = new URLRequest("real.swf"); 
var realLoader:Loader = new Loader();
var eventRequest:URLRequest = new URLRequest("event.swf"); 
var eventLoader:Loader = new Loader();
//puisque contains n'est pas une action et qu'on ne peut pas mettre this.contains
var main:MovieClip=this; 

studio_btn.addEventListener(MouseEvent.CLICK, function(){
if (main.contains(realLoader)){
removeChild(realLoader)}
if (main.contains(eventLoader)){
removeChild(eventLoader)}	
else {	
TweenLite.to(fond_mc, 1, {x:580, y:385}), 
TweenLite.to(studio_btn, 1, {x:235, y:260});
TweenLite.to(real_btn, 1, {x:50, y:60});
TweenLite.to(event_btn, 1, {x:50, y:160});
TweenLite.to(coll_btn, 1, {x:50, y:260});
TweenLite.to(dd_btn, 1, {x:50, y:360});
TweenLite.to(acces_btn, 1, {x:50, y:460});
TweenLite.to(news_btn, 1, {x:50, y:560});
TweenLite.to(contact_btn, 1, {x:50, y:660});
stuLoader.load(stuRequest); 
addChild(stuLoader);
};	
});


Excusez moi d'être stupide mais une fois de plus je ne comprends pas ce qu'il y a de faux.
Pourtant ce que j'essaye de faire à l'air simple non ?
Allé je réexplique :

J'ai 8 boutons, chacun d'eux appelle un SWF externe et spécifique quand on clic dessus.
Ces SWF sont une suite d'images ou des sortes diaporamas.
J'aimerai que sur ma scène ces SWF externes s'affichent un seul à la fois (celui qui correspond au bouton cliqué) et ne se superposent pas.
Donc quand on passe d'une rubrique à l'autre en cliquant sur un bouton : une des animations externe s'efface et une nouvelle s'affiche.

Un exemple : je clic sur le bouton "studio" -> le fichier studio.swf est chargé et l'animation correspondant à la partie studio (contenue dans le swf) s'affiche.
Ensuite je clic sur le bouton "réalisations" -> j'aimerai que l'animation studio s'arrête et s'efface pour que le diaporama contenu dans realisations.swf ne se mette pas en place par dessus l'animation studio...

Seulement problème, si l'utilisateur clic directement sur "réalisations" sans passer par la page studio et que dans la fonction liée au bouton "réalisations" j'ai mis strictement "removeChild(studioLoader)" flash m'envoie (à juste titre) un message d'erreur comme quoi je tente d'effacer qqch qui n'existe pas. D'ailleurs c'est ce que j'avais fait au départ et ça ne marchais pas, ça finissait par planter.

Alors pour faire simple voici en français ce que j'essaye de retranscrire en AS:

Quand on clic sur le bouton accès :
- si le child "studio" est présent : efface le
- si le child "réalisations" est présent : efface le
- si le child "event" est présent : efface le
- si le child "XXX" est présent : efface le
- sinon : lance le child accès

ou encore (je ne sais pas si c'est possible)

Quand on clic sur le bouton accès :
-efface tout les child présents et lance le child accès

Après il se peut aussi que je ne m'y prend pas correctement et que ce que je viens d'écrire en français ne soit pas la bonne façon de s'y prendre... Mais dans ce cas il faut me le dire clairement.

Je comprends également que vous ne vouliez pas donner le code directement préfèrent donner des indices et mettre sur la voie celui qui demande de l'aide afin qu'il comprenne comment l'AS marche en trouvant par lui-même. C'est une position qui se défend mais là j'ai l'impression que je suis au fond du trou et que je creuse encore. Je suis peut-être stupide mais ce qui est sur c'est que ce n'est pas de la mauvaise volonté ^^
J'ai exploré vos pistes, tenté avec ce que vous m'avez proposé plus haut, tenté d'autres moyens trouvés dans la doc d'adobe mais visiblement j'ai pas été foutu d'interpréter ni la notice, ni vos conseils.
Toutes les différentes façons que j'ai utilisées me semblaient à chaque fois logiques, mais visiblement ma logique et la logique AS3.0 ça fait 2.
Enfin... je ne désespère pas...

M.S
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
24 janv. 2010 à 14:21
et si tu faisais des traces de tes conditions ?
ça te permettrais au moins de foir ce qu'elles donnent ...

Peg'
0
MisterSnow Messages postés 18 Date d'inscription samedi 5 septembre 2009 Statut Membre Dernière intervention 24 janvier 2010
24 janv. 2010 à 17:14
OK c'est fait, visiblement le pb vient des "else"
Je pensais que "else = sinon" mais apparament y'a une ou 2 subtilités dans leur emploi que j'ai pas du saisir -_-'
Va falloir que je me repenche sur le sujet...
Enfin, bref j'ai viré les "else" et pour l'instant ça fonctionne comme je voulais.

Merci Peg'

M.S
0
blunt1337 Messages postés 72 Date d'inscription lundi 10 décembre 2007 Statut Membre Dernière intervention 11 octobre 2011
24 janv. 2010 à 17:33
factorise tous tes tweens par une fonction pour commencer, apres pour supprimer tous les clips :
while (numChildren > 0)
removeChildAt(0);
0
astrolabbcracker Messages postés 106 Date d'inscription mardi 11 janvier 2005 Statut Membre Dernière intervention 11 juin 2012
11 juin 2012 à 22:24
et dire que ça fait 2 ans que je suis passé à l'AS3 et je savais même pas que contains existait... je vous dit pas la bidouille

merci encore peg
0
Rejoignez-nous