AS3 отдельный приемник событий в течение цикла - PullRequest
1 голос
/ 30 декабря 2011

Я не смог найти лучшего названия, чтобы описать мою проблему.

Я хочу добиться этого:

for(var i:int = 0; i < 10; i++) {
     var mc:MovieClip = new MovieClip();
     mc.addEventLister(MouseEvent.MOUSE_OVER, function() {
        mc.y=-20;
     });
}

Моя проблема в том, что mc всегда ссылается на последний mc, созданный в цикле for, поэтому первый созданный mc заставляет последний перемещаться при наведении курсора мыши. Может быть, я мог бы использовать что-то вроде «это» или «я» ...

Есть предложения?

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Существует множество способов обойти это, вы можете использовать объект события

for(var i:int = 0; i < 10; i++) {
     var mc:MovieClip = new MovieClip();
     mc.addEventLister(MouseEvent.MOUSE_OVER, function(e) {
        MovieClip(e.currentTarget).y=-20;
     });
}

Или вы можете использовать анонимное закрытие для создания стабильной области видимости переменной:

for(var i:int = 0; i < 10; i++) {
     (function(mc:MovieClip):void  {
        mc.addEventLister(MouseEvent.MOUSE_OVER, function(e) {
            mc.y=-20;
        });
     })(new MovieClip());
}

Или именованная функция, чтобы сделать то же самое:

function attachListenerTo(mc:MovieClip):void {
    mc.addEventLister(MouseEvent.MOUSE_OVER, function(e) {
        mc.y=-20;
    });
}

for(var i:int = 0; i < 10; i++) {
     attachListenerTo(new MovieClip());
}

Или вы можете создать подкласс MovieClip и прикрепить прослушиватель событий в связанном контексте:

public dynamic class ChildClass extends MovieClip {
    public function ChildClass() {
        this.addEventListener(MouseEvent.MOUSE_OVER, handleOver);
    }

    private function handleOver(e:MouseEvent):void {
        this.y = -20;
    }
}

// And then

for(var i:uint=0;i<10;i++) {
    var mc:MovieClip = new ChildClass();
}

Редактировать

Просто быстрое замечание относительно , почему ваша первая версия терпит неудачу, ActionScript не имеет блоковых областей (в отличие от других языков, таких как C #) и использует подъем переменных.Это означает, что линия var mc:MovieClip не там, где вы думаете, что она есть.На самом деле есть только одна переменная с именем mc и она связана с функциональной областью, что означает, что на каждой итерации цикла вы просто переназначаете одну переменную с именем mc.Поскольку вы создаете анонимную функцию в качестве вашего обработчика, она тоже привязывается к той же области видимости, что и mc.Вот почему mc всегда ссылается на последний MovieClip из цикла, к тому моменту, когда вызывается любое из этих замыканий, проходит много времени после завершения цикла и mc все еще указывает на последний.

2 голосов
/ 30 декабря 2011

Вы хотите сделать что-то вроде этого:

for(var i:int = 0; i < 10; i++) {
     var mc:MovieClip = new MovieClip();
     mc.addEventLister(MouseEvent.MOUSE_OVER, function(evt:Event) {
        evt.currentTarget.y=-20;
     });
}

Обратите внимание, что вместо mc я использую currentTarget события, к которому мы добавили прослушиватель событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...