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

Я делаю игру на AS3. У меня есть три класса (космический корабль, НЛО и табло), все они являются потомками класса GameEngine.

Я хочу поместить eventListeners в Scoreboard, а затем отправить dispatchEvents из Spaceship и UFO для обновления экземпляра Scoreboard.

Поскольку Spaceship и UFO не являются ни родителями, ни дочерними элементами Scoreboard, добавление параметра bubbling = true в dispatchEvent ничего не дает.

Как заставить Scoreboard прослушивать * dispatchEvent *, не делая этого:

GameEngine.scoreboard.dispatchEvent (новое событие ("shipWasHit", true));

Кажется глупым делать это таким образом. Зачем мне вообще использовать dispatchEvent - почему бы не вызвать функцию напрямую? А что, если я хочу, чтобы другие классы прослушивали одно и то же событие dispatchEvent?

Пожалуйста, порекомендуйте.


person tgau    schedule 03.03.2011    source источник


Ответы (4)


Ознакомьтесь с паттерном «Наблюдатель». Вот хорошая ссылка:

http://www.swinburne.edu.au/design/tutorials/P-flash/T-The-Observer-Design-Pattern-in-Actionscript-3/ID-145/

person Ribs    schedule 03.03.2011
comment
ах, облом, я перечислил это как хорошую ссылку, потому что раньше на ней была ссылка для загрузки примера FLA. кажется, сейчас сломан. В любом случае, паттерн Observer - это то, что вам нужно. :) - person Ribs; 03.03.2011

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

Пример кода:

public function Receiver()
{
    addEventListener(Event.ADDED_TO_STAGE, added, false, 0, true);
}

private function added(evt:Event):void
{
    stage.addEventListener(Event.shipWasHit, shipHit, false, 0, true);
}

private function shipHit(evt:Event):void
{
    //code
    evt.stopPropagation();
}

Здесь есть несколько предостережений. Прежде всего, необходимо создать экземпляр этого класса и добавить его в этап, чтобы он мог ссылаться на него. В противном случае вам нужно будет передать этап в качестве параметра, который в некоторых случаях может возвращать значение null. Наконец, вам нужно создать его экземпляр до отправки события, хотя это не похоже на проблему с кодом, который я сейчас вижу.

person Community    schedule 03.03.2011


Ваши космические корабли и НЛО будут делать это:

dispatchEvent(new Event("shipWasHit"));

и ваше табло должно знать, какие космические корабли и НЛО слушать в этих событиях:

someShip.addEventListener("shipWasHit", onShipHit);

и

thatUFO.addEventListener("shipWasHit", onUFOHit);

Хорошее место для добавления этих слушателей - в класс, который создает эти космические корабли и НЛО, или в самом табло, если в какой-то момент вы скажете ему, какие корабли и НЛО слушать.

person frankhermes    schedule 03.03.2011