66. Event Part5. Создаем собственные события

junior – серия статей для начинающих ActionScript-разработчиков.
Все статьи серии:
http://flashpress.ru/blog/category/junior/

Работая над ActionScript приложениями, вы наверняка использовали стандартные флешовые события, например событие клика мыши MouseEvent.CLICK. Вы когда нибудь задумывались что в коде ActionScript можно создавать свои собственные события? В этой статье мы поговорим о том как создавать и “диспатчить” события. Не стоит недооценивать силу и мощь событий. Правильная событийная модель приложения – залог успешной реализации и последующей поддержки вашего flash-приложения. Очень советую вам уделить теме событий как можно больше времени.

Что бы вам легче было понять назначение собственных событий, приведу простой пример. Допустим нам необходимо сделать в игре таймер. Конечно вы можете в основном классе приложения использовать Timer, или Event.ENTER_FRAME. А если ваш таймер должен делать какие то дополнительные действия, например отображать тикающие циферки, и циферки должны постепенно краснеть когда времени осталось меньше чем 50% от максимального. В этом случае гораздо разумнее было бы создать класс AppTimer и реализовать в нем весь необходимый функционал. Возникает вопрос: как из класса AppTimer главному классу приложения Game сообщить информацию о том что время вышло? Как в событии передавать каждую секунду главному классу количество оставшихся секунд? Эти и другие вопросы мы посторонимся разобрать в этой статье.

Итак, у нас есть класс Game – основной класс приложения, и есть AppTimer класс таймер который будет отображать циферки таймера. У класса AppTimer будет один единственный public метод – Start(time:int), этот метод будет стартовать таймер по заданному времени. Каждую секунду таймер будет отправлять событие TICK, у этого события будет два параметра:

  1. elapsed:int – количество оставшихся секунд
  2. danger:Boolean – параметр сообщающий о том что времени осталось очень мало

Также у класса таймера будет еще одно событие COMPLETE, без параметров, информирующее о том что время вышло. Класс Game будет слушать события класса AppTimer. Схематически это можно отобразить следующим образом:
event-part5-1

Как видим из этого рисунка, в определенный момент времени создается один объект event и отправляется в “кругосветное путешествие”, а это значит что любой желающий может слушать это событие, и все они получат один и тот же объект event.

Тут очень важно понять что всем слушателям передаются не разные экземпляры одного класса Event, а именно один и тот же экземпляр event. Мы вернемся к этому вопросу в отдельной статье

Вы можете спросить, зачем такая сложность, когда можно было бы передать в класс AppTimer ссылку на Game, и просто вызывать методы класса Game прямо внутри класса AppTimer. Такой подход плох тем, что два класса получаются взаимно зависимыми. Т.е. изменение одного класса повлечет за собой неминуемое изменение другого. Такой код часто называют спагетти-код . Спагетти-приложение очень тяжело развивать и поддерживать после разработки. Про потерянные нервные клетки коллег, которые будут работать с таким кодом я вообще промолчу, для меня это больная тема :( Как серпом по я… простите не удержался :)

В классе Game у нас будет кнопка start, при нажатии которой, вызывается метод Start у таймера. Далее кнопка должна быть не активная, до тех пор пока не будет получено событие COMPLETE. Также класс Game слушает событие TICK и когда времени остается критически мало, издает звуковой сигнал.

Приступим к написанию нашего приложения. Вот как выглядит наш класс AppTimer:

Этот класс использует наше собственное событие AppTimerEvent, вот как может выглядеть этот класс:

В конструкторе AppTimerEvent в методе super, есть еще два необязательных параметра. Вторым параметром передается bubbles:Booelan. По умолчанию этот параметр имеет значение false, это значит событие не будет всплывать в файзе пузырей. Про пузыри в событиях можно почитать в статье. Третим параметром можно передать cancelable:Boolean – это параметр указывает можно ли отменять данное событие методом stopPropagation и stopImmediatePropagation. Подробно про отмену событий с помощью методов stopPropagation и stopImmediatePropagation можно почитать здесь.


Ну и класс Game:

Готовая флешка:

Здесь должна быть флешка. Установите Flash Player

В данном примере мы использовали библиотеки fl_ui.swc и FPColor.swc, не забудьте подключить их в своем проекте. Библиотеки лежат в каталоге swc/ в архиве с исходниками.

Скачать исходники можно здесь

Задание #1

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

Здесь должна быть флешка. Установите Flash Player

Подсказка: создайте в событии новый параметр который будет содержать процент опасности. Затем в методе sound.play() третьим параметром передайте объект класс SoundTransform для задания звука

Если у вас что то не получилось или вы хотите получить оценку сделанному, прикладывайте в комментариях или отправляйте мне на почту архив с вашим проектом. Отправить письмо можно в разделе Контакты

Да прeбудет с вами Flash.
Serious Sam
Эту статью прочитали 1589 раз

Возникли вопросы по статье? Не стесняйтесь спрашивать в комментариях или любым другим способом на странице Контакты .

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


Комментарии ВКонтакте:




Комментарии Facebook:




Комментарии WordPress: