Как отправить событие из одного класса и прослушать его в другом классе, который не является дочерним или родительским для первого класса? - PullRequest
0 голосов
/ 03 марта 2011

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

Я хочу поместить eventListeners в Табло и затем отправить dispatchEvents с Космический корабль и НЛО , чтобы обновить Табло Экземпляр.

Поскольку Космический корабль и НЛО не являются ни родителями, ни потомками Табло , добавление параметра bubbling = true в dispatchEvent ничего не делает.

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

GameEngine.scoreboard.dispatchEvent (new Event ("shipWasHit", true));

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

Пожалуйста, сообщите.

Ответы [ 4 ]

2 голосов
/ 03 марта 2011

Проверьте шаблон Observer. Вот хорошая ссылка:

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

1 голос
/ 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();
}

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

0 голосов
/ 03 марта 2011

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

dispatchEvent(new Event("shipWasHit"));

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

someShip.addEventListener("shipWasHit", onShipHit);

и

thatUFO.addEventListener("shipWasHit", onUFOHit);

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

0 голосов
/ 03 марта 2011
...