ИГРОДЕЛ
Войдите на сайт или зарегистрируйтесь!!!

ActionScript 3.0. Урок 8-1. События

Перейти вниз

ActionScript 3.0. Урок 8-1. События

Сообщение автор Admin в Вс Фев 21, 2010 4:24 am

ActionScript 3 полностью обновил способ, которым обрабатывались события в ActionScript. Существуют две главные темы, определяющие события ActionScript 3:

1. Последовательная обработка событий с новым собственным классом EventDispatcher.
2. Поддержка передачи событий внутри объектов отображения.



Хотя класс EventDispatcher не является абсолютно новым, так как существовал в архитектуре V2 компонента, представленной в компонентах Flash MX 2004, в ActionScript 3 EventDispatcher был обновлен и сделан неотъемлемой частью языка ActionScript, ответственной, по существу, за всю обработку событий. Как это понимать применительно к событиям в ActionScript 3?


отсутствует on(event){}
отсутствует onClipEvent(event){}
отсутствует добавление скриптов в выбранные объекты. Период.
отсутствует object.onEvent = function(){} (для собственных событий)
отсутствует addListener
отсутствуют листенеры, основанные на объекте (теперь только с использованием методов/функций)

В ActionScript 3 все обработчики событий связываются с событиями посредством addEventListener и состоят из единственной функции листенера. С событиями в ActionScript 3 вы получаете гибкость листенеров (более одного обработчика для любого одного события) и эффективность 2-й версии метода addEventListener (может выделять события), плюс увеличение в производительности как результат класса EventDispatcher, являющегося теперь собственным классом флеш-плеера.

Также, в ActionScript 2, при вызове обработчика события, он получал аргумент Object (типа Object), содержащий некоторую информацию о событии, такую как тип события и любые свойства, которые могут быть специфическими для этого события. ActionScript 3 формализовал этот процесс, имеющий сейчас предопределенные классы Event, предназначенные для использования внутри событий вместо общих объектов, использовавшихся с ActionScript 2. Эти событийные объекты содержат тип события, место порождения события, текущий объект, получающий событие, а также несколько других свойств, используемых для описания произошедшего события.

Разные виды событий имеют разные виды классов Event. Самым базовым является класс Event, но существуют также и другие классы Event, такие как MouseEvent, KeyboardEvent, и многие другие. Эти классы зачастую также содержат типы событий в качестве неизменных свойств класса. Событие click, например, имеет тип события "click", который определяется в классе MouseEvent в качестве MouseEvent.CLICK. Цель использования этих значений вместо их строковых представлений заключается в том, чтобы компилятор ActionScript имел возможность предупредить вас об орфографических ошибках, если вы их совершите.

button.addEventListener("clikc", handler); // no error
button.addEventListener(MouseEvent.CLIKC, handler); // Error!

Вкратце, обработка событий в ActionScript 3 означает:

использование методов addEventListener/removeEventListener
ожидание типов событий, хранящихся в классах Event
использование функции (не объекта) обработчика/листенера
определение обработчика/листенеров для получения аргумента типа Event

// ActionScript 3 event handler
function clickSubmit(event:MouseEvent):void {
gotoAndStop("submitFrame");
}

// add clickSubmit event handler as listener of the
// click event received by submit_button instance
submit_button.addEventListener(MouseEvent.CLICK, clickSubmit);

Наряду с тем, как определяются обработчики событий, вы также найдете изменения в том, как они работают и распознаются. Изменилось много имен событий, в то время как другие события были добавлены, а некоторые даже удалены. Здесь приведено короткое сравнение некоторых общих событий между ActionScript 2 и ActionScript 3.


Общие интерактивные события
ActionScript 2 ActionScript 3 Различия
onPress "mouseDown" (MouseEvent.MOUSE_DOWN)
onRelease "mouseUp" (MouseEvent.MOUSE_UP), "click" (MouseEvent.CLICK) Событие click очень похоже на событие onRelease, так как оно зависит от объекта, вначале получающего событие mouseDown, тогда как mouseUp может произойти независимо от того, что было нажато
onReleaseOutside "mouseUp" (MouseEvent.MOUSE_UP) Это событие было удалено, но использование события mouseUp на сцене (благодаря передаче) позволит вам определить, когда кнопка мыши была отпущена за пределами изначально нажатого объекта

onRollOver

"mouseOver" (MouseEvent.MOUSE_OVER), "rollOver" (MouseEvent.ROLL_OVER) Теперь для перемещения курсора над объектами могут использоваться два события; mouseOver будет передаваться, rollOver не будет
onRollOut "mouseOut" (MouseEvent.MOUSE_OUT), "rollOut" (MouseEvent.ROLL_OUT) Теперь для удаления курсора с объекта могут использоваться два события; mouseOut будет передаваться, rollOut не будет
onDragOver "mouseOver" (MouseEvent.MOUSE_OVER), "rollOver" (MouseEvent.ROLL_OVER) Выявление "drag" придется осуществлять вручную в сочетании с событием mouseDown
onDragOut "mouseOut" (MouseEvent.MOUSE_OUT), "rollOut" (MouseEvent.ROLL_OUT) Выявление "drag" придется осуществлять вручную в сочетании с событием mouseDown
mouseDown "mouseDown" (MouseEvent.MOUSE_DOWN) Теперь работает только, когда мышь находится над объектом, посылающим событие (как onPress); обычные объекты не могут быть сделаны листенерами объекта Mouse, чтобы он мог получить это событие, могут только экземпляры InteractiveObject
mouseUp "mouseUp" (MouseEvent.MOUSE_UP) Теперь работает только, когда мышь находится над объектом, посылающим событие (как onRelease, но не требует, чтобы объект был сначала нажат); обычные объекты не могут быть сделаны листенерами объекта Mouse, чтобы он мог получить это событие, могут только экземпляры InteractiveObject
mouseMove "mouseMove" (MouseEvent.MOUSE_MOVE) Теперь работает только, когда мышь находится над объектом, посылающим событие; обычные объекты не могут быть сделаны листенерами объекта Mouse, чтобы он мог получить это событие, могут только экземпляры InteractiveObject
onKeyDown "keyDown" (KeyboardEvent.KEY_DOWN) Объект должен быть в фокусе, чтобы получить это событие; обычные объекты не могут быть сделаны листенерами объекта Key, чтобы он мог получить событие, могут только экземпляры InteractiveObject
onKeyUp "keyUp" (KeyboardEvent.KEY_UP) Объект должен быть в фокусе, чтобы получить это событие; обычные объекты не могут быть сделаны листенерами объекта Key, чтобы он мог получить событие, могут только экземпляры InteractiveObject


Вы можете заметить тему уменьшения числа событий, необходимых для работы с ActionScript. Более ранние события onPress и onMouseDown теперь были объединены в одно событие mouseDown в ActionScript 3. Точно также, вы видите события, которые менее глобальны и более специфичны для родственного объекта. Событие mouseMove, например, теперь работает только, когда курсор мыши находится над объектом, обрабатывающим событие. Похожим образом события key реагируют только на объекты, имеющие в данный момент фокус.

Другие типы поведения относительно событий мыши и объектов отображения также изменились. В ActionScript 2, например, добавляющем любой обработчик onPress, onRelease или похожий обработчик события мыши "on" клипу, приводило к появлению курсора в виде руки (или пальца), когда мышь находилась над этим клипом. Это больше не действует в ActionScript 3. Этот курсор в виде руки не будет виден до тех пор, пока свойство buttonMode и useHandCursor объекта отображения не приобретут значение true (useHandCursor имеет значение true по умолчанию, но buttonMode не имеет). Устанавливая buttonMode в значение true, сфокусированный объект активируется на получение события click, если на клавиатуре нажата клавиша пробел или Enter.

// Show the hand cursor for myButton
// and allow clicking through Spacebar and Enter
myButton.buttonMode = true;

Точно так же, при определении тех же обработчиков события в ActionScript 2, которые предоставляли курсор в виде руки, вы также сообщали флеш плееру, что клип был активирован для получения событий мыши, или, что для этого экземпляра необходимо перехватить и обработать события мыши. Клипы без тех "on" обработчиков событий мыши игнорировали события мыши и позволяли проходить им к любым экземплярам клипов под ними с включенной обработкой событий мыши. В ActionScript 3 все объекты отображения, способные обрабатывать события мыши (любой экземпляр на экране, являющийся наследником класса InteractiveObject, включая Sprites и MovieClips) будут иметь способность обрабатывать эти события по умолчанию. Они не дают событиям возможности дойти до экземпляров, расположенных под ними, даже если они не имеют определенных для них обработчиков событий. Чтобы изменить это, следует установить свойство mouseEnabled объекта в значение false.

// Allow objects beneath the overlay
// instance to receive mouse events
overlay.mouseEnabled = false;

Существует похожее свойство mouseChildren, относящееся к объектам-потомкам внутри экземпляра контейнера объекта отображения. Когда свойство mouseChildren установлено в false, объекты-потомки не будут получать события мыши, но главный объект-родитель будет их получать (предполагая, что mouseEnabled установлено в true). Это пригодится при работе с передачей событий.

// Prevent the child objects in the
// window instance from receiving mouse events
window.mouseChildren = false;
avatar
Admin
Admin

Сообщения : 92
Очки : 280
Репутация : 36
Дата регистрации : 2010-02-20

Посмотреть профиль http://game-dll.mirbb.net

Вернуться к началу Перейти вниз

Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения