Création dynamique de plusieurs MovieClip dans une boucle AS3 [Résolu]

sep2vigne 50 Messages postés lundi 17 mars 2008Date d'inscription 29 janvier 2010 Dernière intervention - 16 déc. 2008 à 00:37 - Dernière réponse : sep2vigne 50 Messages postés lundi 17 mars 2008Date d'inscription 29 janvier 2010 Dernière intervention
- 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
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 17 déc. 2008 à 09:42
3
Merci
- 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'

Merci pegase31 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 123 internautes ce mois-ci

Commenter la réponse de pegase31
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 16 déc. 2008 à 00:44
0
Merci
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'
Commenter la réponse de pegase31
sep2vigne 50 Messages postés lundi 17 mars 2008Date d'inscription 29 janvier 2010 Dernière intervention - 16 déc. 2008 à 20:53
0
Merci
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
Commenter la réponse de sep2vigne
pegase31 6161 Messages postés dimanche 21 décembre 2003Date d'inscription 4 septembre 2013 Dernière intervention - 16 déc. 2008 à 21:20
0
Merci
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'
Commenter la réponse de pegase31
sep2vigne 50 Messages postés lundi 17 mars 2008Date d'inscription 29 janvier 2010 Dernière intervention - 17 déc. 2008 à 00:46
0
Merci
- 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
Commenter la réponse de sep2vigne
sep2vigne 50 Messages postés lundi 17 mars 2008Date d'inscription 29 janvier 2010 Dernière intervention - 18 déc. 2008 à 02:23
0
Merci
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
Commenter la réponse de sep2vigne

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.