Итак, берем книгу "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);
}
}
}
компилируем его
любуемся на сообщения о том, что 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;
}
}
компилируем его
убеждаемся, что примитивная рисовалка работает.