Création dynamique de plusieurs MovieClip dans une boucle AS3

Résolu
sep2vigne Messages postés 50 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 29 janvier 2010 - 16 déc. 2008 à 00:37
sep2vigne Messages postés 50 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 29 janvier 2010 - 18 déc. 2008 à 02:23
Bonjour,
Voici mon code :

for ( var i:int = 0; i < 20; i++ )
{                   
    
//... Je dessine un cercle noir de diamètre 20px positionné à 100px des bords haut et gauche :  


     var cercle:Shape = new Shape();
           cercle.graphics.beginFill(0x000000);
           cercle.graphics.drawCircle( 100, 100, 20 );
    
//... Je crée un MovieClip qui va contenir mon cercle :


     var conteneur:MovieClip = new MovieClip();               
           conteneur.addChild( cercle);
    
//... Puis j'ajoute mon MovieClip à la liste des objets affichés sur la scène :


     addChild( mp3Ball );              
    
//... Enfin, j'appel une classe qui déplace mon MovieClip vers de coordonnées tirées aléatoirement dans une boucle ENTER_FRAME :


    
//... Les paramètres passés au constructeur de ma classe MvmtAleatoire sont :


    
//...
le MovieClip à déplacer


    
//... la limite minimum des nouvelles coordonnées sur X et Y

    
//... la limite maximum des nouvelles coordonées sur X

    
//... la limite maximum des nouvelles coordonées sur Y


     var mouvement:MvmtAleatoire = new MvmtAleatoire( mp3Ball, marge, stage.stageWidth - marge, stage.stageHeight - marge);       
}

RESULTAT :Je me retrouve bien avec 20 cercles noires sur la scène. Il sont placés à des coordonnées
d'origine
aléatoires (comme demandé dans le constructeur de MvmtAleatoire). Ils entamment bien tous un premier déplacement vers des coordonnées
toutes
aléatoires et différentes.

MON PROBLEME :Dès le 2e Déplacement, tous mes MovieClip viennent se positionner au même Y puis varient uniquement sur X. De plus, lorsque j'appel la fonction stop(); de

MvmtAleatoire (fonction qui consiste simplement à supprimer le Event.ENTER_FRAME qui anime mes cercles) cela ne stop que le dernier MovieClip crée dans la boucle

.







TOUT CA POUR DEMANDER (car je pense que mon soucis vient "en autre" de là mais c'est pour cette quéstion précisément que je viens vous voir) :



Comment créer une variable MovieClip à la volée dans une boucle, lui assigner un nom d'instance propre (mc_0, mc_1, mc_2 ...), lui affecter des événements ...

EN BREF :Existe-t-il un équivalent au set( "blabla", true ) mais du genre set( "mc_" + i, MovieClip ) ... comprenez-vous ?

Le fait d'écrire var mc:MovieClip = new MovieClip(); dans une boucle > cela signifie donc qu'à chaque tour ma variable est écrasée et remplacée par une nouvelle possédant le même nom.
Mais comment faire pour que l'accès à la variable du tour précédent ne soit pas définitivement perdu ?
Je n'arrive pas à comprendre comment utiliser efficacement la concaténation en AS3.

Vous souhaitant de bonnes fêtes,
A+, Seb

6 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
17 déc. 2008 à 09:42
- tu confond effectivement les variables des éléments graphiques et les éléments graphiques eux-même
- si ta classe extend un élément graphique, elle hérite directement de ses propriétés ... et donc de name !

Peg'
3
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
16 déc. 2008 à 00:44
Bonsoir,

Il suffit de donner un nom à ton Shape de cette façon : cercle.name = "cercle"+i;
De cette façon, tu pourras l'appeller via : getChildByName("cercle"+nb); //nb étant ne numéro du cercle à appeler.

Ce n'est pas la meilleure solution, mais elle fonctionnera dans ton cas sans créer de classe particulière.

Peg'
0
sep2vigne Messages postés 50 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 29 janvier 2010
16 déc. 2008 à 20:53
Salut Pegase,

Merci beaucoup pour ton retour qui va me permettre de débloquer mon projet.
Avant d'aller tester tout ça, je me pose une question :

Etant donné que ma Shape n'est qu'une forme ajoutée à un movieClip. Une fois qu'elle est addChildée, je n'ai plus rien d'autre à lui demander (en tout cas rien de directement adressée à elle sans passer par son conteneur ... bref).
Aussi je pense plutôt utiliser .name pour donner un nom à mon MovieClip.

Le petit grain qui continue de me tracasser :
Imaginons que dans une bouble for, je déclare une nouvelle variable "var conteneur:MovieClip = new MovieClip();"
Je nomme ensuite mon MovieClip fraichement déclaré de la fçon que tu m'as indiquée : conteneur.name = "truc_" + i;
Au tour suivant de la boucle for, lorsque le code va relire "var conteneur:MovieClip = new MovieClip();", ne va-t-il pas considérer la variable "conteneur" comme étant un nouveauMovieClip (vide donc). Comment est-il alors possible que mon "conteneur" du tour précédent existe encore à ce moment là ?...


De plus je déclare une autre variable "mouvement", instance de ma classe
MvmtAleatoire.
Le constructeur de cette classe récupère en paramètres le dernier MovieClip "conteneur" connu pour ce tour de boucle.
Il lui ajoute un EventListener (particulièrement moche > ENTER_FRAME)
.





>>> Mais du coup si mon conteneur est écrasé entre temps, tout comme mon instance de "mouvement", sauvagement remplacée au tour de boucle suivant par une nouvelle instance ... portant le même nom ... comment je fais pour parler à l'un ou appeller la méthode de l'autre ????






Dernière quéstion en coup d'vent : pour utiliser .name sur une occurence de ma classe mouvementAleatoire, dois-je définir au préalabale une fonction name() dans ma classe ou uniquement une variable String qui stock la valeur donnée.

Bon j'arrette pasque je pourrai continuer comme ca toute la nuit,

A+, Seb
0
pegase31 Messages postés 6138 Date d'inscription dimanche 21 décembre 2003 Statut Modérateur Dernière intervention 4 septembre 2013 12
16 déc. 2008 à 21:20
alors dans l'ordre :

- pour toujours avoir un seul movieclip, il suffit de le déclarer en début de boucle et le tour est joué.
- quand tu ajoutes un clip à la liste d'affichage, il est placé dans cette liste et tu ne peux donc plus l'écraser même en faisant "new"
- DisplayObject.name est une propriété déjà existante et n'a dont pas besoin d'être déclarée au préalable (comme x, y, width, etc ...)

Peg'
0

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

Posez votre question
sep2vigne Messages postés 50 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 29 janvier 2010
17 déc. 2008 à 00:46
- bonheur
- bonheur partiel : oui mais une erreur devrait logiquement être relevée si la nouvelle occurrence "conteneur = new .." n'écrase pas l'ancienne occurrence. Je ne peux pas avoir deux occurrence "conteneur" ..?? je crois que j'suis en train de mélanger les noms de variables avec les bons vieux _mc...
- bonheur partiel itou : la classe MvmtAleatoire est une de mes classes, et comme je n'ai pas crée de propriété "name" dans cette classe je n'peux pas faire MvmtAleatoire.name ... si ? (c'était cette question que j'me posai tout à l'heure).

En tout cas big up comme on dit ;)
a+, Seb
0
sep2vigne Messages postés 50 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 29 janvier 2010
18 déc. 2008 à 02:23
Et bin tu vois quand tu veux
Bon c'est cool, j'ai plus aucun souci pour cibler mes clips en utilisant le getChildByName( "machin_" + i );
J'aime de plus en plus l'AS3.
la prochaine étape c'est de m'assurer que je supprimer bien tous ce que je crée (listener, var plu utilisées... occurences .. bref tout ca)

Merci beaucoup pour cette échange,
En ésperant pouvoir t'aider un jour,
Seb
0
Rejoignez-nous