AS3, для цикла создания кнопки внутри мувиклипа и как ее вызвать? - PullRequest
0 голосов
/ 13 августа 2010

Вот мой полный код

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);
}

Результат:

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

Есть ли такой способ, чтобы я мог использовать цикл для создания кнопки с другим именем и добавить ее вслушатель событий?

Ответы [ 3 ]

1 голос
/ 13 августа 2010

Ваша проблема - закрытие function(evt:MouseEvent){} (информация JavaScript применима и к ActionScript, так как они оба ECMAScript).Вот что вы можете сделать:

function makeClickListener(i:int) {
    return function(evt:MouseEvent) {
        nothing(i);
    };
}
...
for(...) {
    ...
    btn.addEventListener(MouseEvent.CLICK, makeClickListener(i));
}
0 голосов
/ 13 августа 2010
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 );
 }
0 голосов
/ 13 августа 2010

в вашем примере ваш я не делаю то, что вы думаете, он делает. Вы объявили это как глобальную переменную, и переход к функции, как вы делаете, не имеет смысла. В конце ваши кнопки просто сообщают о текущем значении i (которое после цикла всегда равно 8).

Мне нравится другое предлагаемое решение, но вот более объектно-ориентированное решение, которое может оказаться полезным в зависимости от того, что вы делаете с вашей кнопкой (или другими объектами в будущем).

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

Теперь вы используете MyButton вместо Button и в свой цикл добавляете

btn.myIndex = i;

затем присоедините универсальный обработчик событий

btn.addEventListener(MouseEvent.CLICK, myHandler);

который будет выглядеть так:

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

Смотрите ... целью события всегда будет объект, к которому вы прикрепили событие. Именно этому объекту вы должны придавать любые значения, которые хотите сохранить. Лично я предпочитаю такой подход, потому что тогда информация относится к объекту (и может использоваться другими элементами, которым он может понадобиться), а не в обработчике и только в обработчике.

...