Pb de boucle for

Résolu
Signaler
Messages postés
20
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
27 mars 2008
-
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
-
Ma question va peut etre vous paraitre compliqué mais je suis sui que mon erreur est toute bete sauf que j'arriva pas a la trouvé...

voila j'ai dans ma scène deux clip : bou_1 et bout_2   qui sont deux boutons

pour les effet survolé de clique et tout j'ai tapé du code sur la frame 1 de ma scène.
je défini se qui doit se passé pour chaque évènement de souris...

bout_1.onRollOut = function { ..... }
bout_1.onRollOver = function { ...... }
bout_1.onPress = function { ...... }
bout_1.onRelease = function { ...... }

bout_2.onRollOut = function { ..... }

bout_2.onRollOver = function { ...... }

bout_2.onPress = function { ...... }

bout_2.onRelease = function { ...... }

ET TOUT FONCTIONNE BIEN DE CETTE FACON

Or plus tard je voudrai qu'il y ai plein de boutons donc je voudrai mettre tout cela dans une boucle for pour reduir la taille du code.

j'ai donc fait

for( j=1 ; j<=2 ; j++) {
eval("bout_"+j).onRollOut = function { ..... }
eval("bout_"+j).onRollOver = function { ...... }
eval("bout_"+j).onPress = function { ...... }
eval("bout_"+j).onRelease = function { ...... }
}

Or le onRelease de mes bouton ne marche plus... comme il faut. Normalement quand je clique sur un bouton puis sur le second le premier se déselectionne pour que le deuxieme soit le seule sélèctioné, et inversement.
Or maintenant les deux se sélectionnent....SNIF

Voici le code qui fonctionne pas :

//INTERFACE BOUTONS ça ce sont les condition de départ
selectioner = new Array();
// au départ rien n'est selectioner
selectioner["bout_2"] = false;
selectioner["bout_1"] = false;
fond.onRelease = function() {
    //si on clique sur le fond sa déselectione tout   
    selectioner = new Array();
    bout_2.gotoAndStop("out");
    bout_1.gotoAndStop("out");
};

//BOUT_J   la boucle commence ici
for (j=1; j<=2; j++) {
    eval("bout_"+j).onRollOver = function() {
        if (!selectioner["bout_"+j]) {
            this.gotoAndPlay("over");//apparence survolé (seulement si clip non séléctioner)
        }
    };
    eval("bout_"+j).onRollOut = function() {
        if (!selectioner["bout_"+j]) {
            this.gotoAndPlay("out");//apparence déselectioner = RollOut (seulement si clip non séléctioner)
        }
    };
    eval("bout_"+j).onPress = function() {
        this.gotoAndPlay("press"); //apparence préssé
        this.startDrag();
    };
    eval("bout_"+j).onRelease = function() {
        if (!selectioner["bout_"+j]) { //(seulement si clip pas déjà séléctioner)
            for (i =1; i<= 20; i++) { //SELECTION, donc sa déselection tout le/les autre clip séléctioner
                selectioner["bout_"+i] = false;//afin qu'aucun bouton ne soit séléctioner je met toute les valeur du tableau sur false
                eval("bout_"+i).gotoAndStop("out"); //apparence déselectioner pour tous = RollOut <italique> C'est ces commandes qui ne s'effectuent pas...snif</gras>
                }
            selectioner["bout_"+j] = true;//celui-ci est la nouvelle selection
            this.gotoAndPlay("release"); //apparence séléctioné
        }
        this.stopDrag();
    };
}

A mon avis sa peut venir que du fait qu'il y ai deux boucles l'une dans l'autre mais sa devrai marcher pourtant.... j et i c'est diffèrent
et eval("bout_"+j) remplace bout_1 ou bout_2 selon les passage de boucle, ainsi que les this corresondant a ces derniers non...

Please aidé moi je vais me tiré une balle ! ! ! !

6 réponses

Messages postés
1203
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
23 juillet 2009
2
Hello,

Il me semble que tu te mélanges un peu les pinceaux

Selon moi il n'est pas utile d'utiliser un array pour stocker l'état du bouton (sélectionné ou non). Cela peut se faire directement dans le bouton en lui affectant une variable SELECTED par exemple.
Ensuite pour simplifier les choses, je propose de créer une fonction qui remet tous les clip à zéro (non sélectionné) sauf un clip que tu lui donne en parametre.
Abandonne aussi l'adressage en "eval" ca fait flash 4 ou 5 ...remplace là par la notation entre crochets plus actuelle this["bout_"+i].gotoAndStop("out");
Attention dans l'exemple ce-dessous tes boutons doivent commencé a bout_0 et non bout_1 !
Remarque, dans ton code parfois tu utilise gotoAndPlay parfois gotoAndStop Je suis parti du principe que tout est en gotoAndStop

var totalBoutons:Number=2 // le nombre total de boutons que tu vas utiliser

fond.onRelease = function() {
    //si on clique sur le fond sa déselectione tout  
    resetBtn(-1) // Appel la fonction resetBtn en précisant que tout doit être désélectionné sauf le Bout_-1... qui n'existe pas donc tout sera désélectionné
};

// La fonction qui désélectionne tous les bouton sauf celui que tu passe en parametre
function resetBtn(sauf:number){
    for (var i:Number=0;i<totalBoutons;i++){
        if(i!=sauf){
           this["bout_"+i].gotoAndStop("out");
           this["bout_"+i].SELECTED=false;
        }
    }
}

//BOUT_I   la boucle commence ici
for (var i:Number=0; i<totalBoutons; i++) {
    this["bout_"+i].ID=i // Affectation d'un identifiant unique au bouton
    this["bout_"+i].SELECTED=false // Affectation d'une variable SELECTED (Boolean) au bouton
  
    // création des actions au RollOver, RollOut,.... des boutons
    this["bout_"+i].onRollOver = function() {
        if (!this.SELECTED) {
            this.gotoAndStop("over");//apparence survolé (seulement si clip non sélectionner)
        }
    }
    this["bout_"+i].onRollOut = function() {
        if (!this.SELECTED) {
            this.gotoAndStop("out");//apparence déselectionner = RollOut (seulement si clip non sélectionner)
        }
    }
    this["bout_"+i].onPress = function() {
        this.gotoAndStop("press");//apparence pressé
        this.startDrag()
        }
    }
    this["bout_"+i].onRelease = function() {
        this.stopDrag()
        this.gotoAndStop("release");//apparence sélectionné
        this.SELECTED=true
        resetBtn(this.ID) // on remet à zéro tous les boutons SAUF celui qui vient d'être sélectionné
        }
    }
}

@+
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
2
Salut,
super ta fonction, Girou. Tester et approuvé.
Juste deux petite faute :
function resetBtn(sauf:number){  // Number à la place de number
et
   this["bout_"+i].onPress = function() {
        this.gotoAndStop("press");//apparence pressé
        this.startDrag()
        }//ACCOLADE EN TROP
    }
    this["bout_"+i].onRelease = function() {
        this.stopDrag()
        this.gotoAndStop("release");//apparence sélectionné
        this.SELECTED=true
        resetBtn(this.ID) // on remet à zéro tous les boutons SAUF celui qui vient d'être sélectionné
        }//ACCOLADE EN TROP
    }
}
Par contre un truc m'a toujours pris la tête avec les boucles de bouton. Par exemple si dans le press tu mets trace("message"+i);, le trace est toujours message2. Le moyen que j'avais trouvé était d'introduire une série de switch case pour différencier les états de i... mais peut-être y aurait-il un autre moyen ???

Tout vient à qui sait attendre
Messages postés
1203
Date d'inscription
lundi 10 mars 2003
Statut
Membre
Dernière intervention
23 juillet 2009
2
Yep,

sorry pour les erreurs de casse ou d'accolades -> mais je fait ca sans aucun éditeur AS (n'en ai pas au boulot :o) alors ca coince souvent

trace("message"+i);

C'est pour cela que j'introduis la notion d'identifiacteur du bouton bouton.ID=i là, tu affecte une valeur à une variable
dans trace("message"+i); la fonction connait la dernière valeur de i et utilise celle là.
donc trace("message"+this.ID) va te donner la bonne valeur

@+
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
2
Génial ! Merci.
Quant aux erreurs, c'est flash qui les indiquent, donc pas de problème.
Merci

Tout vient à qui sait attendre
Messages postés
20
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
27 mars 2008

Tout d'abord Merci Beaucoup, vous etes de vrai profs pour moi !

Je tien a m'excuse de ne pas etre tres clair dans mes question, c'est que je ne sui s pas encore très exprimenté, et j'ai appris flash au fur et a mesure de tutos entutos [ je ne parle pas encore tres couranment le Flashouillard ! ],et j'ai surment adoptée de mauvais réflex d'ecriture, dont je te remecie de notifier et de corriger.

Merci Girou et inaden => cela fait déjà plusieur fois que tu participe a mes petit problèmes flash   big up et merci encore...

PS : juste une petite question je ne connai pas la syntax de condition : i!=sauf  ( c'est si i est diffèrent de sauf ) c'est bien sa non?
Messages postés
618
Date d'inscription
mercredi 4 avril 2007
Statut
Membre
Dernière intervention
27 août 2010
2
Yes

Tout vient à qui sait attendre