2010-08-13 12 views
0

Voici mon code completAS3, pour le bouton de création de boucle à l'intérieur de MovieClip et comment l'appeler?

import fl.controls.*; 

var test:MovieClip = new MovieClip(); 
var btn:Button; 

for(var i:int = 1; i<=7; i++){ 
    btn = new Button(); 
    btn.name = "btn" + i; 
    btn.x = i * 100; 
    test.addChild(btn); 
    btn.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent) { nothing(i); }); 
} 

addChild(test); 

function nothing(bla:int):void { 
    trace("You clicked " + bla); 
} 

Résultat:

You clicked 8 
You clicked 8 
You clicked 8... 

Y at-il de toute façon, de telle sorte que, je peux utiliser pour la boucle pour créer différents bouton nom, et l'ajouter à un écouteur d'événement?

Répondre

1

Votre problème est le function(evt:MouseEvent){}closure (Les informations JavaScript s'appliquent également à ActionScript, car elles sont toutes les deux ECMAScript). Voici ce que vous pouvez faire:

function makeClickListener(i:int) { 
    return function(evt:MouseEvent) { 
     nothing(i); 
    }; 
} 
... 
for(...) { 
    ... 
    btn.addEventListener(MouseEvent.CLICK, makeClickListener(i)); 
} 
+0

Merci, meilleure et la plus rapide réponse –

0

Dans votre exemple, votre i ne fonctionne pas comme vous le pensez. Vous l'avez déclaré comme une variable globale et le passage dans la fonction comme vous le faites n'a aucun sens. A la fin vos boutons rapportent simplement la valeur actuelle de i (qui après la boucle est toujours 8). J'aime l'autre solution proposée, mais voici une solution plus orientée objet, ce qui peut être utile en fonction de ce que vous faites avec votre bouton (ou d'autres objets dans le futur).

public class MyButton extends Button{ 
    public var myIndex:Number; 
} 

Maintenant, vous utilisez MyButton au lieu de bouton et dans votre jet de boucle dans

btn.myIndex = i; 

puis attach gestionnaire d'événements générique

btn.addEventListener(MouseEvent.CLICK, myHandler); 

qui ressemblerait à ceci:

function myHandler(evt:MouseEvent){ 
    trace(evt.target.myIndex); 
} 

Voir ... la ta Le résultat de l'événement sera toujours l'objet auquel vous avez joint l'événement. C'est à cet objet que vous devez attacher les valeurs que vous souhaitez conserver. Personnellement, je préfère cette approche, car alors l'information est avec l'objet (et peut être utilisée par d'autres éléments qui pourraient en avoir besoin) plutôt que dans le gestionnaire et seulement dans le gestionnaire.

+0

Beau concept OO. J'apprends encore la programmation OO. C'est une technique très utile pour moi, merci =) –

0
var test:MovieClip = new MovieClip(); 
var btn:Button; 

for(var i:int = 1; i<=7; i++){ 

btn = new Button(); 

btn.name = i.toString(); 
btn.x = i * 100; 

test.addChild(btn); 
btn.addEventListener(MouseEvent.CLICK, nothing); 

} 


function nothing(event:MouseEvent):void { 
    //trace("You clicked " + int(event.currentTarget.name)); 
trace("You clicked " + event.currentTarget.name); 
}