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

Итак, берем книгу "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

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

Комментарии

для тех кто работает под Windows

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

можно и другие.
самый простой вариант, наверное - создать отдельный проект для тестов примеров в haxeFD (плагин для FlashDevelop2) и просто менять название класса в его настройках перед компиляцией.

второй пример

второй пример под линуксом не компиляется: Module TryMouseEvent does not define type TryMouseEvent

не компиляется: Module TryMouseEvent does not define type TryMou

Надо либо поменять название класса в примере на class TryMouseEvent, либо имя файла на TryMouseEvents.hx
Ошибка аналогична идеологии програмирования Java классов.

правильно,

правильно, класс то TryMouseEvents называется, а модуль TryMouseEvent:)

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.