Boucle variable dynamique tween [Résolu]

Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
- - Dernière réponse : cs_mic1331
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
- 22 juil. 2010 à 00:40
Bonjour a tous, je fais appelle a vos lumières car j'ai chercher sur pas mal de forum mais la solution n'ai toujours pas la bonne ! Donc je suis en as2 je cherche a mettre sur des boutons dont le nombre varie selon la valeur max dans la boucle for donc voila le code (je ne met que la parti qui bloque):

//C'est la fonction que j'appelle dans ma boucle
btpar = function(nom, base, mult){
if(mult == 1){
arri = base+animytween;
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false); 
}else{
mult--;
arri = espace*mult+base+animytween;
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false); 
}
}; 

//Ma boucle:
var n1:Number= new Number();//j'ai essayé Object, Array c'est idem.
for(n=1; n<max+1; n++){
n1[n]=n;//c'est ici que ça coince trace(n1[n]) m'affiche 1, 2, 3 etc selon ma boucle mais pas dans mes fonctions mais ça fonction sur le rollover..
eval("sur"+n1[n]).onRollOver = function(){
btpar("par"+n1[n], basepar1y, n1[n]);
btpar("parne"+n1[n], baseparne1y, n1[n]);
btpar("entete"+n1[n], baseentete1y, n1[n]);
btpar("article"+n1[n], basearticle1y, n1[n]);
}
//des clips ce cree en amont par1, par2 etc, le reste c'est pour calculer la valeur y dont j'ai besoin dans l'animation j'ai besoin que n1[n] m'affiche 1 lorsque je passe sur "sur1", 2 sur "sur2" etc..  


Voila j'avoue que je perd espoir depuis le temps que je cherche ^^ donc j'espère que vous serez m'éclairer si je n'ai pas été assez clair n'hésiter pas a me demander tous ce dont vous auriez besoin ^^ Voila merci d'avance a ceux qui liront tout ça :).
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
3
Merci
Solution trouver ^^, il suffit qu'après avoir créé mon clip je lui assigne un "name", ce qui me permet décrire this.name dans chaque bouton et donc me retourner la valeur que je veux en fonction du clip que j'active donc (c'est juste un exemple):
for(i=2; i<max+1; i++){
duplicateMovieClip(eval("to"+(i-1)), "to"+i, h++);
eval("to"+i).name = i;
eval("to"+i).onRollOver = function(){
bt("nom_du_clip"+this.name);//Donc this.name me retournera la valeur 1,2,3..etc selon le clip que j'active !!
}

Voila comme tu as dit tout problème a ça solution ^^

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 128 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_mic1331
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
0
Merci
Hello,

comment crées-tu tes boutons ? Tu dupliques dynamiquement un bouton existant ? Et quel est le but de la boucle exactement ? En fait j'ai du mal à piger ce que tu veux faire véritablement.
Donnes nous plus d'éléments quitte à mettre dans ton post le code qui est an amont afin qu'on comprennes bien le pourquoi du comment.

A plus ,

BBFUNK01
//C'est en forgeant qu'on devient forgeron... ;-) ;
Commenter la réponse de BBFUNK01
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
0
Merci
Je me doutais que des éléments manquaient donc je vais expliquer le but de ce script qui est d'inclure le code que je vais poster (très brouillon et il manque communications php que j'ai fait ailleurs) dans un autre swf dans un scrollpane pour faire défiler les articles avec un header autour. Ces articles sont stocker dans une bdd sql, toutes cette partie fonctionne, la ce que je veux faire c'est animer chaque article lorsque l'on passe la souri dessus, donc il me manque juste a savoir comment créé des variable qui contienne "1", "2" etc car dans ma boucle for si je met i pour mes "1", "2" etc il va me donner juste la dernière valeur de i, ce qui aura pour conséquence d'animer seulement le dernier article or je veux que tous les articles s'animent, donc j'ai trouver comment concaténer une variable pour pouvoir en créé de nouvelle a chaque fois que le for recommence, mais ça plante toujours je pense pas que la solution que j'ai essayer peut marcher de toutes façon donc je vais poster mon code qui est pas vraiment lisible je vais donc essayer de rajouter des commentaire pour que vous suivez:
(si ça ne suffit pas comme explication demandez le)
import mx.transitions.Tween;
import mx.transitions.easing.*;
//Différentes variable qui serviront au paramètre du script
ok=1;
var n1:Number= new Number();
n=1;
dtween = 15;
ltween = 8;
i=1;
h=6;
hh = 1000;
animytween = 8;
espace = 300;
max = 3;
pl._height = max*espace;
prop = Strong.easeOut;
prop2 = Strong.easeIn;
proparticle = Strong.easeIn
duration = 3;
duration2 = 3;

//////////////////////////////////////Assignation Var _y////////////////////

//Position Clip de base:
basepar1y = par1._y;
baseparne1y = parne1._y;
baseentete1y = entete1._y;
basearticle1y = article1._y;

//////////////////////////////////////Fin///////////////////////////////////

//Fonction tween pour le RollOver:
btpar = function(nom, base, mult){
trace(mult);
trace(nom);
if(mult == 1){
arri = espace*mult*0+base+animytween;
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false); 
}else{
mult--;
arri = espace*mult+base+animytween;
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false); 
}
};

//Fonction tween pour le RollOut:
btrpar = function(nom, base, mult){
trace(nom);
trace(mult);
if(mult == 1){
arri = espace*mult*0+base;
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false); 

}else{
mult--;
arri = espace*mult+base;
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false); 

}
};

//Fonction qui duplique les partie qui compose mon article:
bb = function(){
duplicateMovieClip(eval("par"+(i-1)),"par"+i,h++);
duplicateMovieClip(eval("parne"+(i-1)),"parne"+i,h++);
duplicateMovieClip(eval("entete"+(i-1)),"entete"+i,h++);
duplicateMovieClip(eval("article"+(i-1)),"article"+i,h++);
duplicateMovieClip(eval("sur"+(i-1)),"sur"+i,h++);
eval("par"+i)._y += espace;
eval("parne"+i)._y += espace;
eval("entete"+i)._y += espace;
eval("article"+i)._y += espace;
eval("sur"+i)._y += espace;
eval("par"+i)._alpha = 0;
eval("parne"+i)._alpha = 0;
eval("entete"+i)._alpha = 0;
eval("article"+i)._alpha = 0;
eval("article"+i).text = i;
bt();
}

//Fonction qui me permettra de faire liaison avec php plus tard, qui affiche article avec une animation(courte certe ^^ mais sera modifier par la suite) et qui me permet de relancer mes fonction:
bt = function(){
var tn1:Tween = new Tween(eval("par"+i), "_alpha", prop, 0, 100, duration, false);
var tn1:Tween = new Tween(eval("parne"+i), "_alpha", prop, 0, 100, duration, false);
var tn1:Tween = new Tween(eval("entete"+i), "_alpha", prop, 0, 100, duration, false);
var tn1:Tween = new Tween(eval("article"+i), "_alpha", prop2, 0, 100, duration2, false);
tn1.onMotionStopped = function(){
if(i != max+1){
i++
btn();
}
}
}
//Tout passe par cette fonction car comme les clip sont déjà créé il ne faut pas les dupliquer au début ça permet de pouvoir les placer où on veut sur la scène les autres ce calerons par rapport au premier par rapport a la variable espace qui défini l'écart entre chaque article ensuite on passe a bb(); pour dupliquer
btn = function(){
if(i==1){
eval("article"+i).text = i;
eval("par"+i)._alpha = 0;
eval("parne"+i)._alpha = 0;
eval("entete"+i)._alpha = 0;
eval("article"+i)._alpha = 0;
bt();
}else if(i != max+1){
bb();
}else{

//C'est donc ici que se pose mon souci le reste fonctionne très bien. Je place mon for ici car j'attend d'abord que tous mes clips soient créé sinon ben ça marche pas ^^:
for(n=1; n<max+1; n++){
n1[n]=n;
eval("sur"+n1[n]).onRollOver = function(){
btpar("par"+n1[n], basepar1y, n1[n]);
btpar("parne"+n1[n], baseparne1y, n1[n]);
btpar("entete"+n1[n], baseentete1y, n1[n]);
btpar("article"+n1[n], basearticle1y, n1[n]);
}
eval("sur"+n1[n]).onRollOut = function(){
btrpar("par"+n1[n], basepar1y, n1[n]);
btrpar("parne"+n1[n], baseparne1y, n1[n]);
btrpar("entete"+n1[n], baseentete1y, n1[n]);
btrpar("article"+n1[n], basearticle1y, n1[n]);
}
}

}
}
btn();

//Voila si il y a des questions sur le script a me poser si on peut l'améliorer je suis la (je ne veux pas mettre de timer j'aime bien mes algos en tween :P)


Voila donc j'attend ta réponse ^^ en espérant que tu ne te perde pas la dedans car je fais toujours ça de façon brouillon Merci d'avance
Commenter la réponse de cs_mic1331
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
0
Merci
Re,

je trouve que ça fait beaucoup de code pour affecter une "action" identique sur des éléments qui sont si j'ai bien compris, construits sur le même modèle (les articles quoi).
Pourquoi n'essaies tu pas ainsi :

tu crées ton clip avec tout ce qu'il est sensé contenir comme conteneurs pour publier les articles.
Ensuite au chargement des différents articles stockés sur ta BDD, tu effectues une boucle et tu dupliques ce clip en fonction du nombre d'articles, et dans la fonction pour dupliquer le clip tu définis les actions sur les RollOver, RollOut, onPress, et onRelease, de chacun de tes clips.

A plus ,

BBFUNK01
//C'est en forgeant qu'on devient forgeron... ;-) ;
Commenter la réponse de BBFUNK01
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
0
Merci
Enfaite le variable max contiendra le nombre d'article dans ma bdd donc il en créera le nombre voulu, ensuite il contiendra non plus i mais le texte dans la bdd, comme je te dit je n'ai pas rajouter la communication php que j'ai déjà codé ailleurs donc pour le reste c'est ok il me faut juste savoir comment faire ce for qui m'embête ^^ si c'est possible..
Commenter la réponse de cs_mic1331
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
0
Merci
Re,

hum... Ca n'est franchement pas évident pour moi de voir où ça cloche dans ton code, d'autant plus que je n'ai jamais eu à coder une animation de ce type. Le fait est que tu veux que tes clips soient "dispatchés" à différents endroits sur la scène mais pas telle une frise par exemple, donc si ces clips ne sont pas "dispatchés" de manière logique, je ne sais pas si passer par une boucle est la meilleure solution... Et question : pourquoi tu déclares des variables au début du code pour définir tes tweens :
prop = Strong.easeOut;
prop2 = Strong.easeIn;
proparticle = Strong.easeIn

Ca n'est pas une gain de code dans la mesure où tu écris tes tweens ensuite comme ceci :
var tn:Tween = new Tween(eval(nom), "_y", proparticle, eval(nom)._y, arri, dtween, false);

Du coup du as des variables qui ne sont pas à mon sens nécessaires et c'est plus une source de confusion qu'autre chose .
Pour ma part je n'ai jamais bossé avec une base de données MySQL donc je ne saurai pas t'indiquer quelle est la bonne méthode pour remplir tes clips, et comme tu as beaucoup de variables déclarées, et bien je t'avoue que c'est un peu flou pour moi.

A plus ,

BBFUNK01
//C'est en forgeant qu'on devient forgeron... ;-) ;
Commenter la réponse de BBFUNK01
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
0
Merci
Oui je comprend, mais les déclarer au début me permet de modifier les paramettres rapidement sans chercher mon tween plus bas, c'est une habitude que j'ai, ensuite pour le php comme je t'ai dit tout fonctionne c pas un problème ça, mais j'ai laisser tombé l'idée d'animer mes clips même si j'aurais voulu savoir le faire de cette façon tant pi je me concentre sur le header désormais demain je mettrais un lien si tu veux voir ce que ça donne sans le php même si ce n'est que le début tous sera bien fini dans 1 mois je pense, voilou bonne nuit ^^ et merci de t'être intéresser sur mon cas
Commenter la réponse de cs_mic1331
Messages postés
1313
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
20 juin 2014
6
0
Merci
Re,

c'est vrai qu'un lien qui permette de voir ton boulot serait le bienvenu et permettrait certainement de mieux comprendre où tu veux en venir, tiens-moi au courant. Le truc qu'il faut retenir c'est que tout problème a sa solution, mais c'est vrai que parfois... il faut galérer avant de la trouver

A plus ,

BBFUNK01
//C'est en forgeant qu'on devient forgeron... ;-) ;
Commenter la réponse de BBFUNK01
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
0
Merci
C'est sur.. Donc voila le lien sans php ni rien juste le swf (c'est juste pour que tu vois) car après réfléxion on va faire ça en html avec un peu de flash pour animer autour ^^:
http://shcz.free.fr/flashkod/test.php

Voila.
Commenter la réponse de cs_mic1331
Messages postés
31
Date d'inscription
samedi 22 avril 2006
Statut
Membre
Dernière intervention
24 août 2010
0
Merci
Bon comme j'ai balancer ma solution un peu a l'arraché (car j'étais content d'avoir trouver) je vais vous donner un code source pour que ce soit plus parlant ^^, il vous suffit d'importer le code ci-dessous et de créé un clip en haut a gauche avec pour nom d'occurence "to1" et un autre invisible (blanc alpha zero) de meme taille que le premier la position n'ai pas importante et de l'appeler "sur1"(invisible car il se superposera sur l'autre) le but de ce script étant d'appliquer du tween en masse avec un for, il vous suffit de modifier la variable max pour changer le nombre de "to1"(en espérant que certain en auront l'utilité):
import mx.transitions.Tween;
import mx.transitions.easing.*;

espace = 10;//écart entre chaque clip
max = 20; //nombre de clip
h=0;
anim = 6;
basew = to1._width;
baseh = to1._height;
basex = to1._x;
sur1._x = to1._x;
sur1._y = to1._y;
plus = espace;
yy = 0;

bt = function(nom, u){
baset = eval("sur"+u)._y;
var tn:Tween = new Tween(eval(nom), "_y", Elastic.easeOut, eval(nom)._y, baset+anim, 30, false);
};
btf = function(nom, u){
baset = eval("sur"+u)._y;
var tn:Tween = new Tween(eval(nom), "_y", Elastic.easeOut, eval(nom)._y, baset, 30, false);
};

for(i=2; i<max+1; i++){
trace(i);
duplicateMovieClip(eval("to"+(i-1)), "to"+i, h++);
duplicateMovieClip(eval("sur"+(i-1)), "sur"+i, h++);
eval("sur"+i).name = i;
plus += basew+espace;
if(plus > Stage.width-(basew+espace)){
plus = espace;
yy++;
eval("to"+i)._y = (baseh+espace)*yy+10;
eval("to"+i)._x = basex;
}else{
trace(plus);
eval("to"+i)._x = plus;
}
eval("sur"+i)._x = eval("to"+i)._x;
eval("sur"+i)._y = eval("to"+i)._y;
eval("sur"+i).onRollOver = function(){
bt("to"+this.name,this.name);
}
eval("sur"+i).onRollOut = function(){
btf("to"+this.name,this.name);
}
}
sur1.onRollOver = function(){
bt("to"+1,1);
}
sur1.onRollOut = function(){
btf("to"+1,1);
}
Commenter la réponse de cs_mic1331