Події ActionScript 3
У попередніх уроках міні-курсу «Основи анімації в ActionScript 3» я вже торкався теми подій, які автоматично генеруються коли щось відбувається в системі або користувач певним чином використовує клавіатуру або мишу. У AS3 архітектура подій повністю інтегрована у Flash Player.
У цьому уроці ми детально розберемо концепцію подій, а також Ви дізнаєтесь:
- Що таке слухач події в ActionScript 3 і яка його роль
- Що таке обробник події в ActionScript 3 події і для чого він служить
- Які параметри передаються обробнику події
- Ознайомтеся з деякими подіями миші та клавіатури
Щоб добре розібратися в цій темі, Вам потрібно засвоїти кілька додаткових концепцій:
- слухачі подій
- обробники подій.
Ці назви говорять самі за себе. Слухач — це об'єкт, який слухає чи чекає, коли відбудеться певна подія. Обробник - це функція, яка описує все, що має статися після того, як ця подія станеться.
Слухачі подій у ActionScript 3
Як було сказано вище, слухач — це об'єкт, який слухає чи чекає, коли відбудеться певна подія. Ви можете зробити Ваш клас слухачем певної події, викликавши функцію addEventListener. Цієї функції Ви повинні передати як аргументи:
- ім'я події, що слухає об'єкт
- ім'я функції-обробника цієї події
Ви можете використовувати додаткові параметри для додавання слухачів подій, але в цьому курсі «Основи анімації в ActionScript 3» ми не будемо їх розглядати. Синтаксис, показаний вище, забезпечить Вашіпотреби під час роботи з подіями у 99% випадків.
Зверніть увагу на те, що ім'я події "enterFrame" - це рядок (як Вам вже добре відомо, всі рядки ми укладаємо в лапки). Зрозуміло, що можливі помилки під час запису — забули поставити лапки, наприклад. В результаті обробник події не спрацює, але повідомлення від компайлера про цю помилку Ви не отримаєте!
Щоб уникнути подібних ситуацій в AS3 існує інший, рівноцінний спосіб запису імен подій. Коли Ви маєте справу з функцією addEventListener, Ви можете використовувати для цієї властивості класу Event. Давайте перепишемо код, наведений вище, так:
Якщо Ви вирішите дізнатися, яке значення присвоєно властивості ENTER_FRAME , то виявите, що це "enterFrame" , що є рядком.
Тепер Ви можете припустити, що і тут при записі коду можливі помилки. Правильно. Але якщо таке станеться, програма відмовиться компілювати Ваш код і повідомить про це. Наприклад, у Вас з'явиться повідомлення про те, що такої властивості клас Event не має. Крім того, в ньому буде вказано не тільки рядок, на якому ця помилка зроблена, але і перший «проблемний» символ на цьому рядку. Це дуже хороша система підказок.
На додаток до типів подій у класі Event існують інші типи подій в інших класах, наприклад MouseEvent.MOUSE_DOWN , KeyboardEvent.KEY_DOWN , TimerEvent.TIMER і т.д. Всі ці події можна було б записати за допомогою рядків: "mouseDown", "keyDown", "timer", але я б Вам радив звикати відразу до запису властивостей, а не рядків.
Ось ще одна важлива для запам'ятовування. Іноді, наприклад, у попередньому прикладі, Ви можете викликати функцію addEventListener безпосередньо в класі. У цьому випадку Ви ніби кажете класу, щоб вінслухав свою власну подію enterFrame. В інших випадках Вам, можливо, доведеться слухати події згенеровані іншими об'єктами. Наприклад, у Вас є кнопка з ім'ям myButton. Коли користувач кликає на ній, вона генерує подію mouseDown . Для того, щоб слухати цю подію, Ви повинні викликати метод addEventListener наступним чином:
Останнє, про що хотілося б сказати. Ви можете надавати будь-які імена функціям-обробникам подій. Наприклад, я назвав свою функцію onEnterFrame . Це було зроблено просто тому, що це ім'я добре описує подію, а також звик саме до такого запису. Ви могли б дати цю функцію інше ім'я, зрозуміле Вам. Наприклад, doCoolThing.
Розбираючи код, написаний іншими програмістами, Ви помітите, що імена обробників подій часто записуються з on на початку. Потім йде описове ім'я, що говорить про те, звідки прийшла подія, наприклад, onStartButtonClick або onSpaceshipCrash .
Як Ви будете записувати імена - це справа Вашого особистого смаку та уподобань. Головне, будьте в цьому постійні, щоб з одного погляду на код було зрозуміло, що обробник події це обробник події.
Йдемо далі. Я вже казав, що слухач слухає події, але точнішим було б таке визначення: слухачеві повідомляється про те, що подія сталася.
Об'єкт, що генерує події, зберігає в собі список всіх об'єктів, які додали себе до нього як слухачі. Якщо об'єкт здатний генерувати події різного типу, як, наприклад, mouseDown , mouseUp і mouseMove , він зберігатиме окремий список слухачів кожної події. Коли одна з подій відбувається, об'єкт проходить за відповідним списком і повідомляє кожному об'єкту-слухачеві про те, що подія сталася.
Ще один спосіб опису подій — сказати, що об'єкт, який стає слухачем, підписується на відповідну подію. А об'єкт, який генерує події, транслює подію всім своїм передплатникам.
Якщо Ви хочете, щоб об'єкт перестав слухати подію, то Ви можете прямо вказати йому на це, викликавши метод removeEventListener :
Цей код говорить об'єкту про те, щоб виключив зі свого списку слухачів певний слухач. Таким чином, він перестане отримувати відповідні повідомлення надалі.
Тепер давайте перейдемо до практики та розберемо конкретний приклад. Код, записаний нижче, створює новий об'єкт (sprite), поміщає його сцену, малює у ньому певну графіку і додає до нього слухач події.
Що це все означає? Більшість функції init просто створює sprite, малює в ньому коло і розміщує його в центрі сцени. Для нас найважливіші останні два рядки.
Тут клас додає себе як слухач подій MOUSE_DOWN та MOUSE_UP. Зауважте, що це властивості класу MouseEvent , а щоб усе працювало коректно, цей клас має бути імпортований. Як обробники подій передаються дві функції onMouseDown і onMouseUp .
Зазвичай обробнику події як параметр передається об'єкт події, в якому зберігається відповідна інформація про нього (подію). Як мінімум, це буде інформація про об'єкт, що згенерував подію.
У разі подій миші, цією інформацією буде:
- місце розташування курсору миші на момент події
- яка кнопка миші була натиснута
- і т.д.
У разі подій клавіатури цією інформацією буде:
- яка клавіша була натиснута в момент події
- стан інших клавіш, наприклад, Ctrl,Alt та Shift в цей момент
Докладніше про те, яка інформація передається, Ви можете дізнатися з файлів допомоги (Help) програми Flash Professional або у Довіднику ActionScript 3.0 для платформи Adobe Flash.
Збережіть попередній приклад як EventDemo.as та запустіть Flash Player. Тепер у панелі Output Ви можете спостерігати, як виводяться написи щоразу при натисканні та відпусканні лівої кнопки миші на червоному колі (об'єкт — eventSprite).
Обов'язково досягніть того, щоб цей приклад заробив у Вас коректно. Він дуже простий, але є добрим тестом на правильну роботу Вашого середовища розробки.
Якщо ви новачок в ActionScript 3, але у вас все вийшло і ви дійсно зрозуміли, як це працює - прийміть мої вітання! Ви тільки-но перейшли з початкового рівня на середній.
Обробники подій у ActionScript 3
Отже, Ви вже знаєте набагато більше про обробників подій і тепер саме час розібратися зі слухачами.
Раніше я сказав, що об'єкт, який генерує подію його ж і транслює або повідомляє своїх слухачів про те, що певна подія сталася. Як він це робить?
Коли користувач натискає ліву кнопку миші на червоному колі (у нашому прикладі – це eventSprite), то він реагує приблизно так: «Кнопка натиснута! Я маю сповістити своїх слухачів!» (або щось таке). Потім він проходить по списку слухачів події мишівниз і дивиться, хто в ньому знаходиться. Потім він знаходить посилання на головний об'єкт і функцію, яка визначена як обробник події (у нашому прикладі – це onMouseDown). Потім він просто викликає цю функцію та застосовує її до цього слухача. Якщо інші об'єкти зареєструвалися як слухачі події mouseDown , вони будуть теж у списку. Івідповідно, хоч би які обробники вони визначили — вони теж будуть викликані.
Те саме відбудеться і у випадку, коли ліва кнопка буде відпущена, за винятком того, що тепер перевірятиметься список слухачів події mouseUp .
Отже, з цього уроку Ви багато чого дізналися про події в ActionScript 3, а також слухачів та обробників подій. Для того щоб перевірити чи добре засвоєна інформація дайте відповідь на наступні питання:
Контрольні питання щодо матеріалу уроку
- Що таке подія?
- Які типи подій ви знаєте?
- Який метод викликається у тому, щоб зробити об'єкт слухачем події?
- Які параметри передаються цим методом?
- Які властивості класу MouseEvent Вам відомі?
- Які властивості класу KeyboardEvent Вам відомі?
У наступному уроці ми розберемо тему подій в анімації.