Зная, с какого экземпляра символа пришел слушатель события? - PullRequest
0 голосов
/ 27 октября 2010

Мне нужна помощь!Я не сомневаюсь, что это глупая проблема, о которой я только что подумал до такой степени, что сошел с ума.

У меня есть один «главный» экземпляр символа MovieClip (назовем его Mountain) с сопровождающим классом.В ходе выполнения программы я автоматически генерирую 8 других экземпляров одного и того же символа, скажем, каждый из них имеет свой цвет заливки.Когда я щелкнул один из этих автоматически сгенерированных, я хотел, чтобы основной экземпляр изменил цвет на тот, который был автоматически сгенерированным.

Итак, после динамической генерации элемента в другом классе, я добавил eventListener для MouseClick

var thisMountain=new Mountain; 
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);

Но тогда я понял, что eventListener не может сказать функции, которую он вызывает,На каком экземпляре символа была нажата кнопка.Поэтому я пошел и добавил прослушиватель событий в класс «Mountain», но затем он вызывается, даже если щелкнуть основной.Поэтому я добавил логическое значение, когда экземпляр создается для дифференциации, но это похоже на ужасное ужасное кодирование.

Так что мне делать?Этот пример понятен?Должен ли я просто сделать еще один класс, который расширяет горный класс или что-то?Каков наилучший способ сделать это?

Ответы [ 4 ]

4 голосов
/ 27 октября 2010

Вы можете сделать что-то вроде:

item1.addEventListener(MouseEvent.CLICK, itemClicked);
item2.addEventListener(MouseEvent.CLICK, itemClicked);
item3.addEventListener(MouseEvent.CLICK, itemClicked);
...
...
function itemClicked(e:MouseEvent):void{
 trace((e.currentTarget as MyInstances).myColor);
}

, но если вы создавали предметы в отдельном классе и не знали экземпляр, или сколько их было создано и т. Д. И т. П.посмотрите в «Пользовательские события».Ваши элементы при нажатии будут вызывать событие, похожее на следующее.

var myItemClickedEvt:MyCustomEvent = new MyCustomeEvent("itemClicked", myColor);

Затем вы можете прослушать событие itemClicked и затем сделать что-то вроде:

function itemClicked(e:MyCustomeEvent):void{
     trace(e.myColor);
}

..но я, наверное, просто запутываю ситуацию ... вам, наверное, просто нужно:

(e.currentTarget as MyInstances).myColor
2 голосов
/ 27 октября 2010

просто добавьте переменную id к вашему горному классу:

var thisMountain=new Mountain('id1'); 
thisMountain.ChangeColor();
thisMountain.addEventListener(MouseEvent.CLICK, itemClicked);
this.addChild(thisMountain);
function itemClicked(e:MouseEvent):void{
    trace((e.currentTarget as Mountain).id);
}
1 голос
/ 27 октября 2010

Не глупая проблема, но, к счастью, есть простое решение:
Используйте свойство target MouseEvent.
Таким образом, ваш обработчик событий будет выглядеть примерно так:

protected function itemClicked(e:MouseEvent):void {
    var clickedMountain:Mountain = e.target as Mountain; // cast target as a Mountain
    var mountainColor:Color = clickedMountain.mountainColor;

    // do something here to set the color of the main mountain
}

В зависимости от того, как настроен ваш клип Mountain, вам может понадобиться использовать currentTarget вместо target , чтобы убедиться, что вы получаете Гору, а не одного из ее потомков .

1 голос
/ 27 октября 2010

Может быть, я не понимаю ваш сценарий, но почему вы не можете просто использовать свойство event.target?Разве это не то, что вам нужно?Предполагая, что Mountain расширяет DisplayObject, у вас должна быть ссылка на рассматриваемый объект.

Например:

thisMountain.addEventListener(MouseEvent.CLICK, function(evt:MouseEvent):void {
    // do something with evt.target;
});
...