Обработка событий

Итак, берем книгу "ActionScript3.0 Сборник рецептов" Лотт, Шалл, Питерс, и примеры, данные в ней на AS3 переписываем на haXe. Это хорошо тем, что мы сразу будем учиться писать под 9й флеш-плеер и использовать flash9 API.

Для начала набросаем небольшой bash-скрипт для более удобной компиляции исходников.

#!/bin/bash
if [ -z $1 ]
then
        echo 'usage: ./compile class [ouput]'
        echo 'where "class" - main application class name'
        echo 'and "output" - output swf-file name (default: output.swf)'
        exit 1
fi

if [ -z $2 ]
then OUTPUT='output.swf'
else OUTPUT=$2
fi

haxe -swf $OUTPUT \
-swf-version 9 \
-swf-header 300:300:16:ffff66 \
-main \
$1 \
&& flashplayer $OUTPUT

Скрипт принимает два параметра - имя класса и (опционально) имя выходного swf-файла. Он автоматически добавляет все остальные необходимые параметы, вызывает компилятор, и, если не было ошибок, по завершению компиляции вызывает флэш-плеер для отображения swf-файла.

Впрочем, если вы работаете под Виндой, и у вас нет Cygwin, то вам придется либо написать аналогичный bat-скрипт, либо для каждого примера создавать отдельный build.hxml (что нехорошо, ибо противоречит принципу DRY). Хотя можно и другие варианты придумать.

Первый пример - обработка события onEnterFrame. Создаем класс TryEnterFrame.hx

/**
 * @author Yzh
 *
 */

package;

import flash.events.Event;

class TryEnterFrame
{
        private var numCalls:Int;

        public function new()
        {
                this.numCalls = 0;

                flash.Lib.current.addEventListener(Event.ENTER_FRAME, this.onEnterFrame);
        }

        static public function main():Void
        {
                trace('We try EventFrame');
                new TryEnterFrame();
        }

        public function onEnterFrame(e:Dynamic):Void
        {
                trace('OnEnterFrame Called ' + Std.string(++this.numCalls));
                if(this.numCalls >= 10)
                {
                        flash.Lib.current.removeEventListener(Event.ENTER_FRAME, this.onEnterFrame);
                }
        }
}

компилируем его

./compile TryEnterFrame

любуемся на сообщения о том, что 10 раз сработало событие ENTER_FRAME.

Второй пример -- обработка событий мыши. Создаем класс TryMouseEvent.hx

/**
 * @author Yzh
 *
 */

package;

import flash.display.Sprite;
import flash.display.Graphics;
import flash.events.MouseEvent;

class TryMouseEvents
{
        private var btn:        Sprite;
        private var gr:         Graphics;

        public function new()
        {
                this.DrawButton();

                this.btn.addEventListener(MouseEvent.MOUSE_DOWN, this.onMouseDown);
                this.btn.addEventListener(MouseEvent.MOUSE_UP, this.onMouseUp);
        }

        static public function main():Void
        {
                trace('We try MouseEvents');
                new TryMouseEvents();
        }

        private function onMouseDown(e:MouseEvent):Void
        {
                this.gr.moveTo(e.localX, e.localY);
                this.btn.addEventListener(MouseEvent.MOUSE_MOVE, this.onMouseMove);
        }

        private function onMouseUp(e:MouseEvent):Void
        {
                this.btn.removeEventListener(MouseEvent.MOUSE_MOVE, this.onMouseMove);
        }

        private function onMouseMove(e:MouseEvent):Void
        {
                this.gr.lineTo(e.localX, e.localY);
        }

        private function DrawButton():Void
        {
                this.btn = new Sprite();
                this.gr = this.btn.graphics;
                this.gr.beginFill(0x9966ff);
                this.gr.drawRect(0, 0, 200, 200);
                this.gr.endFill();
                this.gr.lineStyle(1, 0xff0000, 1);

                flash.Lib.current.addChild(this.btn);
                this.btn.x = 20;
                this.btn.y = 20;
        }
}

компилируем его

./compile TryMouseEvent

убеждаемся, что примитивная рисовалка работает.