Comment se cible un clip nommé dynamiquement avec une variable. [Résolu]

Signaler
Messages postés
9
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2009
-
roopkeed
Messages postés
9
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2009
-
Bonjour a tous,
Malgré mes recherches, je ne comprends pas comment gérer le ciblage de clips qui ont un nom d'occurence incrémenté. Le ciblage parent-clip.clipB.clipC ne marche pas car j'utilise une variable dans le nom  d'occurence .createEmptyMovieClip('ccc1'+j, j);
Quelle est la bonne syntaxe ?
J'y arrive sur une une seule variable (j) à l'aide de crochet : clipparent['clip'+j] mais lorsque je souhaite y inclure un 'clip2'+i, je perds la main. : clipparent['clip'+j]['clip2'+i,] ne prend pas.

Mon but est d'afficher le contenu d'un xml dans un clip ccc0 qui contiendra quelques clips ccc1j de 10 clips cc2i.

lesactus = actualites.firstChild ;
    uneactu = lesactus.childNodes;
    
    for (i = 0;i < M; i++){
        k = i-(Math.round(i / 10) * 10);
        if (k <> 0) {} else {                                       // bizarre mais (k=0) ne passe pas
            ccc0.createEmptyMovieClip('ccc1'+j, j);
            ccc0.attachMovie('mc:visio_ref','ccc1'+j,j);
            ccc0['ccc1'+j]._x = (j*980) ;
            ccc0['ccc1'+j]._y = 0 ;
            j++;
            }                                                               // jusque là ça marche

        ccc0['ccc1'+j].createEmptyMovieClip('clipactu'+i, j+i);
        ccc0['ccc1'+j].attachMovie('mc:visionneuse','clipactu'+i,j+i);
        ccc0['ccc1'+j]['clipactu'+i]._x = 0;
        ccc0['ccc1'+j]['clipactu'+i]._y = (i*26);
        remplir_clip(ccc0['ccc1'+j]['clipactu'+i],uneactu[i]);
        }

Un grand merci pour vos lumières/réponses.

10 réponses

Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009

ok si ca marche ton probleme est résolu si toutefois tu voulais optimiser pour detecter un changement de dizaine le modulo (%) semble l'outil le plus approprié :

for(i=0;i<100;i++){
   if(i%10 == 0){
      trace(i);
   }
}
te donneras :
0
10
20
30
40
50
etc

quelques remarques:
-ton j désigne en fait le chiffre des dizaines si j'ai bien compris c'est effectivement Math.round(i/10)
-ta variable j0 devient inutile avec le test sur le modulo,
-pas la peine d'initialiser i puisque celui s'initialise dans l'instruction for().
-tu utilises une variable tailledoc mais tu ne t'en sert pas par la suite en ecrivant en dur 980, si tu devais en changer ca serait plus simple si tu as dans ton code:ccc0['ccc1'+j]._x = (j*tailledoc);
-(((i-(j*10))*30)+100) correspond en fait à ((i%10)*30+100)
-ta déclaration de k est devenu obsolète pense à la supprimer pour la lisibilité du code
-de même pour tailleclip que je ne te vois pas utiliser ainsi que N et enfin M etant utilisé uniquement pour le for autant faire directement for (i=0; i
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
Bonsoir,

Tu n'as pas déclaré "j" au départ, donc il considère cette variable comme "undefined" et donc pas "0" ..

Peg'
Messages postés
6146
Date d'inscription
dimanche 21 décembre 2003
Statut
Modérateur
Dernière intervention
4 septembre 2013
6
de même pour "k"

Peg'
Messages postés
9
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2009

j'ai bien déclaré j (var j = 0;) mais ni i ni k c'est vrai. Je ne pense pas que ce soit ça. Je viens de tout déclarer et le problème demeure.
Les pistes pour faire fonctionner ça est
soit un problème de syntaxe au niveau des noms de clips
soit, et peut etre aussi, un problème au niveau des profondeurs des clips
Je sèche.

rf
Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009

alors je suis pas un pro, mais j'ai potassé quelques bidouilles maintenant bien rodées pour les problemes de clip crées dynamiquement
la plus simple à mon goût c'est l'instruction with(object) combinée à eval(expression)
ex:creer 10 clips y charger des images et les positionner:

for(cpt_img=0;cpt_img<10;cpt_img++){
        this.createEmptyMovieClip("mc_"+id, this.getNextHighestDepth());
        with(eval("mc_"+id)){
            loadMovie("images/"+id+".jpg");
            _x=((cpt_img-1)%3)*300;
            _y=Math.floor((cpt_img-1)/3)*500;
        }
    }

tu peux faire autant de boucles imbriquées que tu veux with attend en parametre un objet et eval te permet de lui transmettre cet objet à partir de la construction d'une chaine
autre exemple: definir la propriete _x d'un clip puis appeler une de ses méthode

monclip100_546.sousclip374.sousousclip483._x=500;
monclip100_546.sousclip374.sousousclip483.loadMovie("monimage.jpg");
//equivaut avec des variables à :
niv1a=100;
niv1b=546;
niv2=374;
niv3=483;
with(eval("monclip"+niv1a+"_"+niv1b+".sousclip"+niv2+".sousousclip"+niv3)){
_x=500;
//tu peux appeller ici la methode directement sans retapper le chemin complet tant que tu reste dans les accolades du with
loadMovie("monimage.jpg");
}

attention toutefois avec with tu te situes au niveau du clip ciblé donc si tu veux te servir d'autres clips dans d'autres niveaux il faut utiliser une notation relative en remontant ou son chemin complet:
with(mc_1.mc_2){
trace(_name);//mc_2
trace(_parent._name);//mc_1
trace(_root.mc_1._name);//mc_1
}
Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009

erratum pour les puristes j'ai simplifié un peu vite un code pour cet exemple qui necessitait dans mon cas que la boucle démarre à 1 donc pour un placage à l'ecran correct avec la boucle qui part de 0 :
for(cpt_img= 0;cpt_img<10;cpt_img++){
        this.createEmptyMovieClip("mc_"+id, this.getNextHighestDepth());
        with(eval("mc_"+id)){
            loadMovie("images/"+id+".jpg");
            _x=(( cpt_img )%3)*300;
            _y =Math.floor((cpt_img)/3)*500;
        }
    }
Messages postés
9
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2009

en bon débutant, je n'ai pas vu passer souvent les éval et les with dans les tutos de ce forum. Leur utilisation a l'air bien pratique et aurait pu certainement me sauver.

Dans mon cas, le pb venait de la condition :
k = i-(Math.round(i / 10) * 10);
        if (k <> 0) {} else {                }                       // bizarre mais (k=0) ne passe pas

J'ai écrit autrement et s'est passé :
    for (i=0; i<M; i++) {
        j0 = j;
        j = Math.floor(i / 10);
        if ( (j-j0) <> 0) {
            ccc0.attachMovie('mc:visio_ref','ccc1'+j,j);
            ccc0['ccc1'+j]._x = (j*980);
            ccc0['ccc1'+j]._y = 0;
        }

        ccc0['ccc1'+j].attachMovie('mc:visionneuse','clipactu'+i,i);
        ccc0['ccc1'+j]['clipactu'+i]._x = 0;
        ccc0['ccc1'+j]['clipactu'+i]._y = (((i-(j*10))*30)+100);
        remplir_clip(ccc0['ccc1'+j]['clipactu'+i],uneactu[i]);

C'est la fonction Math.round qui m'aurait donc posé problème.

Merci pour tes lumière syl20dies
Messages postés
13
Date d'inscription
mardi 21 octobre 2008
Statut
Membre
Dernière intervention
29 janvier 2009

tres sincerement je ne comprends pas tres bien ton code mais pour la condition if(k=0) j'imagine que  tu as fait du basic en AS les conditions d'égalité s'ecrivent avec deux "="  if(k == 0)
deux même je ne savais pas qu'il acceptait <> come comparateur , on a plutot tendance à voir !=
Math.round() retourne un entier arrondi Math.round(0.4) vaut 0 mais Math.round(0.5) vaut 1
Math.floor() fonctionne sensiblement pareil si ce n'est qu'il n'arrondi pas à l'entier superieur mais toujours à l'entier inferieur ainsi Math.floor(0.9) vaut 0;
je ne sais pas ce que vaut ton j avant que tu ne l'affecte à j0 ( dans une portion de code non jointe?)
mais je crois bien que ton test ne devrais pas être si compliqué et utiliser autant de variables. que cherches tu réellement à tester?
Messages postés
9
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2009

oui en plus j'ai de vieux souvenir de c++ ou autre. j'ai corrigé = pour = = et <> pour !=.
Pour résumer : j'ai un xml avec une quantité M de noeuds.
Je veux les trier par groupes/clip de 10 (ccc1), tout ça dans un grand groupe/clip (ccc0) que je pourrais bouger.
La variable j et j0 me servent à faire mes groupes de 10. c'est le moyen - ptet un peu lourd - de savoir quand i change de dizaine car à ce moment précis j=j0+1.
Voila mon code. C'est peut-etre pas propre et un peu lourd mais maintenant ça marche (meme avec <>) ;)  :
    var M = actualites.firstChild.childNodes.length;
    var N = (Math.round(M/10)*1);
    var tailledoc = 980;
    var tailleclip = ((N*tailledoc)-20);
    var j:Number = 0;
    var k:Number = 0;
    var i:Number = 0;
    var page:String;
    lesactus = actualites.firstChild;
    uneactu = lesactus.childNodes;

    ccc0.attachMovie('mc:visio_ref','ccc1'+j,j);
    ccc0['ccc1'+j]._x = (j*980);
    ccc0['ccc1'+j]._y = 0;
  
    for (i=0; i<M; i++) {
        j0 = j;
        j = Math.floor(i / 10);
        if ( (j-j0) <> 0) {
            ccc0.attachMovie('mc:visio_ref','ccc1'+j,j);
            ccc0['ccc1'+j]._x = (j*980);
            ccc0['ccc1'+j]._y = 0;
        }
        ccc0['ccc1'+j].attachMovie('mc:visionneuse','clipactu'+i,i);
        ccc0['ccc1'+j]['clipactu'+i]._x = 0;
        ccc0['ccc1'+j]['clipactu'+i]._y = (((i-(j*10))*30)+100);
        remplir_clip(ccc0['ccc1'+j]['clipactu'+i],uneactu[i]);
    }

rf
Messages postés
9
Date d'inscription
vendredi 9 avril 2004
Statut
Membre
Dernière intervention
30 janvier 2009

Effectivement la commande modulo semble pile-poil ce dont j'avais besoin.
Un nettoyage s'impose.
Pour info, mes variables tailledoc et N me sont utiles dans une fonction servant à faire glisser mes grand clips.
Encore merci pour tes lumières. Je revaudrais ça à un plus nul que moi.
;)

rf