Лекция 1. Обработка событий
1.1. Обработка события наступления нового кадра
Чтобы отреагировать на событие наступления нового кадра enterFrame, надо указать приложению слушать это событие и определить, какой метод должен вызываться при его возникновении. Это делается с помощью метода addEventListener, который выглядит так:
addEventListener(type:String, listener:Function)
Метод addEventListener имеет два обязательных параметра и несколько дополнительных.
Параметр type - это тип ожидаемого события. Для указания типа события рекомендуется использовать статические свойства класса Event (Событие). Класс Event уже должен быть импортирован, поэтому можно вызывать его метод addEventListener следующим образом:
addEventListener(Event.ENTER_FRAME, onEnterFrame);
Второй параметр, onEnterFrame, ссылается на другой метод класса.
В ActionScript 3.0 нет требования, чтобы этот метод назывался именно onEnterFrame. Однако составлять имя метода-обработчика из on и имени ожидаемого события - это общепринятая традиция. При вызове этот метод принимает экземпляр класса Event, поэтому потребуется импортировать этот класс и определить метод, чтобы он принимал объект события:
import flash.events.Event;
private function onEnterFrame(event:Event)
{
}
Объект event содержит информацию о событии, которая может пригодится при его обработке. Даже если он не используется, все равно надо настроить обработчик на его прием. В ActionScript 3.0 областью видимости метода-обработчика остается его класс.
Пример 1. Приложение для последовательной отрисовки случайных линий по наступлению нового кадра:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Example1 extends Sprite
{
public function Example1()
{
graphics.lineStyle(1, 0, 1);
addEventListener(Event.ENTER_FRAME, onEnterFrame); // добавление слушателя
}
private function onEnterFrame(event:Event):void
{ // тело слушателя события Event.ENTER_FRAME
graphics.lineTo(Math.random()*400, Math.random()*400);
}
}
}
1.2. Реакция на события мыши и клавиатуры
Обработка событий мыши и клавиатуры очень похожа на обработку события enterFrame, но требует некоторой дополнительной работы. В случае событий мыши основной класс приложения не будет получать их напрямую, поэтому он должен слушать их по другому объекту списка отображения.
Пример 2. Создать спрайт, добавляющийся в список отображения, и в нем отрисовывается прямоугольник.
package {
import flash.display.Sprite;
import flash.events.MouseEvent;
public class Example2 extends Sprite
{
private var sprite1:Sprite;
public function Example2()
{
sprite1 = new Sprite();
addChild(sprite1);
sprite1.graphics.beginFill(0xffffff);
sprite1.graphics.drawRect(0, 0, 400, 400);
sprite1.graphics.endFill();
sprite1.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
sprite1.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
Имена событий мыши определяются в классе MouseEvent и методы-обработчики получают экземпляр класса MouseEvent, поэтому данный класс надо импортировать (см. пример 2).
Далее определяем два метода-обработчика, onMouseDown и onMouseUp:
private function onMouseDown(event:MouseEvent):void
{
sprite1.graphics.lineStyle(1, 0, 1);
sprite1.graphics.moveTo(mouseX, mouseY);
sprite1.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
}
private function onMouseUp(event:MouseEvent):void
{
sprite1.removeEventListener(MouseEvent.MOUSE.MOVE, onMouseMove);
}
Методы onMouseDown задают стиль линии нового спрайта и перемещают рисующий курсор в позицию, соответствующую положению мыши. Затем вводится третий слушатель событий мыши для события MouseMove.
Методы onMouseUp удаляют слушателя с помощью метода removeEventListener. Его синтаксис аналогичен addEventListener, но указывает классу прекратить слушать заданное событие.
Далее определяется onMouseMove, а класс и пакет закрываются:
private function onMouseMove(event:MouseEvent):void
{
sprite1.graphics.lineTo(mouseX, mouseY);
}
}
}
Чтобы слушать и отвечать на события клавиатуры, объект, получающий события, всего лишь должен иметь фокус. Для основного приложения это делается путем добавления строки:
stage.focus = this;
Пример 3. Создать класс, который будет слушать событие keyDown и выводить код символа для этой клавиши.
Для событий клавиатуры применяется класс KeyboardEvent.
package {
import flash.display.Sprite;
import flash.events.KeyboardEvent;
public class Example3 extends Sprite
{
public function Example3()
{
stage.focus = this;
addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown);
}
private function onKeyDown(event:KeyboardEvent):void
{
trace("key down: " + event.charCode);
}
}
}