Forums Développement Multimédia

Les formations Mediabox
Les formations Mediabox

Des boutons dans une boucle !

Compatible ActionScript 2. Cliquer pour en savoir plus sur les compatibilités.Par minotor

Un petit rappel en ce qui concerne l'utilisation des boucles, sur une question qui revient trés souvent sur le forum !

Comment faire pour affecter des actions distinctes à plusieurs boutons, au sein d'une même boucle ?

Autrement dit : pourquoi ce code ne marche pas ?

for(var i=0 ;i<4 ; i++ ){
	this["bouton"+i].onRelease = function(){
		trace(i);
	}
}

Avec sur la scène :

  • 4 boutons nommés de “bouton0” à “bouton4”.
  • Le code, qui est bien sur placé sur un calque dédié de la scène principale également.

Et là, surprise, tous les boutons affichent le même nombre en fenêtre de sortie : “3” !!!


Pourquoi ça ne marche pas ?
Effectivement, la boucle est bouclée en quelques fractions de seconde. Le problème est alors qu'au moment ou vous cliquez sur un des boutons, le code suivant est effectué (mais pas avant, car on passe par une fonction) :

trace(i);

Mais vu que la boucle est déjà finie, i est alors toujours égal à sa dernière valeur, ici : 3 !
Pour bien comprendre cette idée, le code suivant, qui ne marche toujours pas, revient au même :

var maFonction = function(){
    trace(i);
}
for(i=0;i<4;i++){
	this["bouton"+i].onRelease = maFonction;
}

De cette manière on voit bien l'origine du problème.
Le onRelease est une fonction qui en fait reste indépendante de la boucle for !


La solution est de passer par un indice !
Il faut donc faire passer au sein de la boucle un indice distinct à chacun des boutons. Ceci se fait simplement de la manière suivante :

for(var i=0 ;i<4 ; i++){
	this["bouton"+i].indice = i;
	this["bouton"+i].onRelease = function(){
		trace(this.indice);
	}
}

Et comme ça il n'y a plus de problèmes !
Même une fois la boucle bouclée, chaque bouton contient désormais son propre indice, qui sert par la suite pour la fonction onRelease. En plus des fonctions onRelease, onPress, etc… le même principe peut être appliqué pour définir par exemple des comportements de clip distincts au sein d'une même boucle, etc…

A BIEN NOTER :
Dans ce dernier code, les deux premier “this” ciblent la scène principale. Par contre le troisième se trouve dans la fonction onRelease de chaque bouton, et il cible donc chaque bouton !


Pour aller plus loin :
En suivant cette logique, on peut également utiliser un tableau de valeur pour multiplier les possibilités de la chose…

Exemple :

mesLiens = new Array("presentation.htm", "liens.htm", "contact.htm", "livredor.htm");
for(var i=0 ; i<4 ; i++ ){
	var clip = this["bouton"+i];
	clip.indice = i;
	clip.onRelease = function(){
		// chaque bouton renvoie alors à une page différente !
		getURL(mesLiens[this.indice], "_self");
	}
}

De cette manière on affecte bien des actions différentes à nos boutons, au sein d'une même boucle…

A BIEN NOTER :
L'ajout de la variable “clip” qui permet de simplifier la programation au sein de la boucle !


Pour toutes questions concernant ce tutoriel, veuillez utiliser les salles apropriées de Flash-Forum !…