Placement dynamique + écouteurs

kyanc07 - 30 mai 2013 à 08:28
 kyanc07 - 4 juin 2013 à 10:29
Bonjour,

Je cherche un moyen de faire ça...

Je sais placer dynamiquement des boutons. Et comme ceci, ça fonctionne :

Code :
Sélectionner tout - Visualiser dans une fenêtre à part



for (var i:Number=1; i<=5; i++) {
var bouton = String("btn"+i);
bouton = new btn();
addChild (bouton)
bouton.x= -20+(i*100);
bouton.y=200
}


Si ce n'est pas bon, merci de formuler une meilleure solution.

Je sais aussi assigner un écouteur quand je place un bouton moi-même.

Mais ici je voudrais le faire dynamiquement. Comment faire pour rendre chaque bouton que je crée interactif quand je le crée ?

Impossible de définir une fonction à l’intérieur de la boucle...

J'ai lu qu'il fallait le faire à l’extérieur avec currentTarget ou target et avec des tableaux... enfin c'est une solution que j'ai lu mais n'arrive pas à l'appliquer ici.

Quelqu'un a une solution simple et efficace ? Je précise que je suis encore tout nouveau dans l'as3. J'ai un peu de mal à tout comprendre.

Merci.

18 réponses

BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
2 juin 2013 à 20:38
Hello,

Utilise la propriété "name" pour identifier tes boutons lorsque tu veux qu'ils effectuent une action :

for(var i:Number = 1; i <= 5; i++){
var bouton:MovieClip = new btn();
addChild(bouton);
bouton.x -20+(i*100); bouton.y 200;
bouton.name = "btn_"+i;
bouton.buttonMode true; bouton.useHandCursor true;
bouton.addEventListener(MouseEvent.CLICK, Fonction);
}

function Fonction(event:MouseEvent):void{
trace(event.currentTarget.name.toString());// te renverra la valeur de la propriété "name" assignée au bouton exécutant la fonction
}


Voilà une piste pour t'aider à y voir plus clair ;).

A+

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
Non seulement ça fonctionne mais en plus ça va me forcer à étudier de nouveaux termes que je n'ai encore vu dans aucun tuto jusqu’à présent.

Je te remercie c'est cool :)
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 07:15
Evidemment que ça fonctionne

De rien

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 07:17
Si tu veux te perfectionner en as3 voici un site qui te fournira de très bonnes bases : Yazo.net

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je suis allé sur ce site, mais je n'y trouve pas toutes les réponses à mes questions et manque de pratique.

Puis je continuer à t’embêter un peu?


function Fonction(event:MouseEvent):void{
trace(event.currentTarget.name.toString());// te renverra la valeur de la propriété "name" assignée au bouton exécutant la fonction
}


C'est cool, ça trace btn_1, btn_2 ect...

mais comment je met ça sous forme de valeur, de variable..

Je le vois, mais comment je peux effectuer une certaine action si j'ai appuyé sur le bouton 1?

if... (si j'ai appuyé sur le bouton1)..alors?


J'ai essayé

if (btn_1==true){
...
}


J'arrive très bien à le faire sur un bouton prédéfini, un truc que j'ai placé moi même, mais ici..

oui je te l'ai dis, je manque de pratique..
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 08:51
Sois plus précis : qu'est-ce que tu veux que tes boutons fassent ?

La propriété "name" te permet de savoir quel bouton est cliqué, ensuite avec cette information tu peux lancer une action relative au bouton, mais ceci implique de savoir quelle action est à effectuer suivant le bouton cliqué, donc tu auras probablement à étoffer ton script pour ce faire.

Tu peux par exemple stocker des informations relatives à chaque bouton dans un array et sélectionner des paramètres lors du clic sur le bouton grâce à l'identification de la propriété "name" du bouton.

Un petit exemple :

var toto:Array = new Array("envoyer un e-mail","afficher une alerte","envoyer vers un script de paiement en ligne","dire merci");

for(var i:Number = 1; i <= 5; i++){
var bouton:MovieClip = new btn();
addChild(bouton);
bouton.x -20+(i*100); bouton.y 200;
bouton.name = "btn_"+i;
bouton.buttonMode true; bouton.useHandCursor true;
bouton.addEventListener(MouseEvent.CLICK, Fonction);
}

function Fonction(event:MouseEvent):void{
trace(event.currentTarget.name.toString());// te renverra la valeur de la propriété "name" assignée au bouton exécutant la fonction
var Indic:Array = event.currentTarget.name.toString().split("_"); // ici tu "découpes" le nom de ton bouton en sectionnant l'underscore
Indic = Indic[1]; // tu récupères alors la 2e coupe, soit le numéro défini après l'underscore lors de la génération de tes boutons, par exemple si le bouton cliqué dont la propriété name est "btn_3" tu récupères "3"
var monIndic:Number = Number(Indic[1]); // ici tu convertis la valeur récupérée en type Number (car initialement elle est de type String), soit 3
if(monIndic < 10){ // si le nombre est inférieur à 10 par exemple...
trace(toto[26]); // Tu traces la valeur du tableau "toto" en index 3 -> "dire merci"
}


C'est juste un exemple qui n'a probablement aucune valeur particulière mais c'est pour te montrer comment tu peux "imaginer" une solution fonctionnelle et efficace dans ton cas, après faut "gratter la feuille" .

Ceci étant dit sois plus loquace dans l'explication de ce que tu souhaites faire et ça nous permettrait de te donner des conseils plus précis.

A+

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 08:53
Petite correction dans l'exemple que je t'ai doné :

function Fonction(event:MouseEvent):void{
trace(event.currentTarget.name.toString());// te renverra la valeur de la propriété "name" assignée au bouton exécutant la fonction
var Indic:Array = event.currentTarget.name.toString().split("_"); // ici tu "découpes" le nom de ton bouton en sectionnant l'underscore
Indic = Indic[1]; // tu récupères alors la 2e coupe, soit le numéro défini après l'underscore lors de la génération de tes boutons, par exemple si le bouton cliqué dont la propriété name est "btn_3" tu récupères "3"
var monIndic:Number = Number(Indic[1]); // ici tu convertis la valeur récupérée en type Number (car initialement elle est de type String), soit 3
if(monIndic < 10){ // si le nombre est inférieur à 10 par exemple...
trace(toto[monIndic]); // Tu traces la valeur du tableau "toto" en index 3 -> "dire merci"
}


BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
pas besoin d'être plus précis car tu as parfaitement deviné ce que je voulais :)
Je me demandais comment récupérer la valeur du bouton..

par contre avec ton code j'obtiens ça quand je clique

btn_1
TypeError: Error #1034: Echec de la contrainte de type : conversion de "1" en Array impossible.
at testecouteur_fla::MainTimeline/Fonction()
btn_2
TypeError: Error #1034: Echec de la contrainte de type : conversion de "2" en Array impossible.
at testecouteur_fla::MainTimeline/Fonction()
btn_3
TypeError: Error #1034: Echec de la contrainte de type : conversion de "3" en Array impossible.
at testecouteur_fla::MainTimeline/Fonction()
btn_4
TypeError: Error #1034: Echec de la contrainte de type : conversion de "4" en Array impossible.
at testecouteur_fla::MainTimeline/Fonction()
btn_5
TypeError: Error #1034: Echec de la contrainte de type : conversion de "5" en Array impossible.
at testecouteur_fla::MainTimeline/Fonction()
0
oups... j'avais pas vu la correction.. je vais tester
0
non... toujours la même erreur de conversion avec Array
0
ça marche mais sans cette ligne

Indic = Indic[1]; // tu récupères alors la 2e coupe, soit le numéro défini après l'underscore lors de la génération de tes boutons, par exemple si le bouton cliqué dont la propriété name est "btn_3" tu récupères "3"
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 09:20
Re,

Le code doit fonctionner normalement, après le mieux est de déclarer tes variables en amont donc en-dehors des fonctions (as3 nécessite le typage fort donc précise bien le type de variable) :

var monIndic:Number;

var toto:Array = new Array("envoyer un e-mail","afficher une alerte","envoyer vers un script de paiement en ligne","dire merci");

// toto[0] = "envoyer un e-mail"
// toto[1] = "afficher une alerte"
// toto[2] = "envoyer vers un script de paiement en ligne"
// toto[3] = "dire merci"

for(var i:Number = 1; i <= 5; i++){
var bouton:MovieClip = new btn();
addChild(bouton);
bouton.x -20+(i*100); bouton.y 200;
bouton.name = "btn_"+i;
bouton.buttonMode true; bouton.useHandCursor true;
bouton.addEventListener(MouseEvent.CLICK, Fonction);
}

function Fonction(event:MouseEvent):void{
trace(event.currentTarget.name.toString());
var Indic:Array = event.currentTarget.name.toString().split("_");
Indic = Indic[1];
monIndic = Number(Indic[1]);
trace(toto[monIndic]);
}


Le trace dans la fonction doit te retourner le numéro de ton bouton, sinon c'est qu'il y a une couille dans le potage quelquepart

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 09:22
Exact, la ligne est effectivement de trop après relecture (sorry ).

A+

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
ben comme je t'ai dis ton code marche parfaitement mais sans la ligne

Indic=Indic[1];


cette ligne suffit
var monIndic:Number = Number(Indic[1]);
0
les messages s’entrecroisent

En tout cas, je te remercie, c'est exactement ce que je voulais


J'espère compter sur ton intervention pour mes prochains problèmes, tu es efficace
0
et.. au fait, pas de soucis, tout le monde peut se tromper, mais ton erreur me permet d'analyser et d'étudier le fonctionnement sans faire bêtement du copier coller. Donc ce n'est pas perdu :)
0
BBFUNK01 Messages postés 1310 Date d'inscription jeudi 16 juillet 2009 Statut Membre Dernière intervention 20 juin 2014 6
3 juin 2013 à 09:48
mais ton erreur me permet d'analyser et d'étudier le fonctionnement sans faire bêtement du copier coller


C'est le but, sans quoi je n'aide pas (dans la mesure où je peux aider ).

A+ et bonne continuation

BBFUNK01

//C'est en forgeant qu'on devient forgeron... ;-) ;
0
Bon... je ne suis pas doué.

Dans le même esprit, j'ai voulu faire de la duplication de clip comme de la neige qui tombe
Mais je n'arrive pas à attribuer des propriétés propres à chaque enfants. J'ai vu un script en AS2 qui donne ça

var i:Number=0;
_root.onEnterFrame = function() {
        i++;
        reference = _root.attachMovie('neige','neige'+i,i);
        reference._x = random(500);
        reference._y = 0;
                reference.onEnterFrame = function() {
                        this._y+=5;
                        if (this._y >=400) {
                                this.removeMovieClip();
                        }
                }
}



Comment reproduire ça en AS3

Je sais faire un truc comme ça

var i:Number=0;
stage.addEventListener(Event.ENTER_FRAME, exec);

var neige1 = new neige();
addChild (neige1);
neige1.x = Math.random()*550;

function exec(evt:Event){

        i++;


neige1.y = i

}


mais comment le faire pour plusieurs?
0
Rejoignez-nous