13 февр. 2011 г.

Туториал для изучения базы Haxe/Flash.



Туториал для изучения базы Haxe/Flash.
Эта статья — мой условный перевод с английского статьи: http://blog.neurotoxic.org/post/2009/01/13/first
Содержимое:
  • Привет Мир
  • Простой прямоугольник
  • Двигаем наш прямоугольник
  • Пользовательский ввод
  • Используем картинку в нашем приложении
  • Используем несколько картинок для создания анимации
Haxe является идеальным языком, если вы захотите добавить Flash приложение на ваш сайт. В текущей версии вы можете создать Haxe/Flash SWF используя все ActionScript3/Flash9 API, совместно с мощным Haxe API.
Так как я только новичек в использовании Haxe, я могу пойти не правильным путем. Я буду рад обсудить если это так.


Привет Мир:

Мы начнем с создания простейшего проекта, с простым отображением текста.

Файл Tutorial.hx (с сайта Haxe.org):

class Tutorial
{
static function main()
{
// создает a TextField
var tf = new flash.text.TextField();
tf.text = "Hello World !";
// добавляем его в список отображения
flash.Lib.current.addChild(tf);
}
}

Файл
compile.hxml:
-main Tutorial

-swf-version 9

-swf-header 320:240:30

-swf tutorial.swf
Строка -swf-header 320:240:30 означает что мы хотим 320 * 240 flash приложение, с 30 кадра/сек.
Компилируем используя команду:

haxe compile.hxml

Вы получите файл tutorial.swf, который можно открыть с помощью firefox.
Результат:



Простой прямоугольник:

Мы хотим создать цветной прямоугольник:

static function main()
{
var myRectangle : flash.display.Shape = new flash.display.Shape();
myRectangle.graphics.beginFill ( 0x990000 );  // the color of the rectangle
myRectangle.graphics.lineStyle ( 1, 0x000000, 1, false, flash.display.LineScaleMode.NONE ); // the border style

// добавляем прямоугольник в верхний левый угол(коодринаты 0,0 )экрана, с шириной и длиной 10.
myRectangle.graphics.drawRect ( 0, 0, 50, 50);
// и
myRectangle.graphics.endFill ();
flash.Lib.current.addChild(myRectangle);
}



Вы можете посмотреть методы что мы используем для отрисовки в API. Помните что большинство методов наследуется от родительского класса DisplayObject.
Результат после компилирования:


Вы можете поиграть с координатами и цветом. Старайтесь использовать и другие классы графики, например lineTo, drawCircle...

Двигаем наш прямоугольник:

Для каждого нового сгенерированного фрейма мы хотим двигать наш прямоугольник.
Мы определим прослушиватель событий ENTER_FRAME для автоматического вызова нашего метода onEnterFrame():

class Tutorial {

    static var myRectangle : flash.display.Shape;
    static var rectangleWidth = 50;
    static var rectangleHeight = 50;

    static function main()
    {
        myRectangle  = new flash.display.Shape();
        myRectangle.graphics.beginFill ( 0x990000 );
        myRectangle.graphics.lineStyle ( 1, 0x000000, 1, false, flash.display.LineScaleMode.NONE );
        myRectangle.graphics.drawRect ( 0, 0, rectangleWidth, rectangleHeight);
        myRectangle.graphics.endFill ();

        flash.Lib.current.addChild(myRectangle);

        flash.Lib.current.addEventListener(flash.events.Event.ENTER_FRAME,function(_) Tutorial.onEnterFrame());
    }

    static function onEnterFrame()
    {
        myRectangle.x ++;
        myRectangle.y ++;
        if( myRectangle.x > flash.Lib.current.stage.stageWidth - rectangleWidth)
            myRectangle.x = 0;
        if( myRectangle.y > flash.Lib.current.stage.stageHeight - rectangleHeight)
            myRectangle.y = 0;
    }
}


Результат:


Пользовательский ввод:

Что если мы хотим двигать прямоугольник используя клавиши стрелок?
Мы просто определим прослушиватель на KeyboardEvent.KEY_DOWN и KeyboardEvent.KEY_UP, чтобы знать когда кнопка нажата/отпущена.

class Tutorial {

    static var myRectangle : flash.display.Shape;
    static var rectangleWidth = 50;
    static var rectangleHeight = 50;
 
    static var moveX : Float = 0; // движение прямоугольника по горизонтали каждый фрейм
    static var moveY : Float = 0; // длижение прямоугольника по вертикали каждый фрейм

    static function main()
    {
        myRectangle  = new flash.display.Shape();
        myRectangle.graphics.beginFill ( 0x990000 );
        myRectangle.graphics.lineStyle ( 1, 0x000000, 1, false, flash.display.LineScaleMode.NONE );
        myRectangle.graphics.drawRect ( 0, 0, rectangleWidth, rectangleHeight);
        myRectangle.graphics.endFill ();

        flash.Lib.current.addChild(myRectangle);

        flash.Lib.current.addEventListener(flash.events.Event.ENTER_FRAME,function(_) Tutorial.onEnterFrame());
     
        flash.Lib.current.stage.addEventListener(flash.events.KeyboardEvent.KEY_DOWN, key_down);
        flash.Lib.current.stage.addEventListener(flash.events.KeyboardEvent.KEY_UP, key_up);
    }
 
    static function key_down(event:flash.events.KeyboardEvent)
    {
        if (event.keyCode == 37) // стрелка влево
            moveX = -1;
        else if (event.keyCode == 39) // стрелка вправо
            moveX = 1;
        else if (event.keyCode == 38) // стрелка вверх
            moveY = -1;
        else if (event.keyCode == 40) // стрелка вниз
            moveY = 1;
    }
 
    static function key_up(event:flash.events.KeyboardEvent)
    {
        if (event.keyCode == 37 && moveX == -1) // стрелка влепо
            moveX = 0;
     else if (event.keyCode == 39 && moveX == 1) // стрелка вправо
            moveX = 0;
     else if (event.keyCode == 38 && moveY == -1) // стрелка вверх
            moveY = 0;
     else if (event.keyCode == 40 && moveY == 1) // стрелка вниз
            moveY = 0;
    }

    static function onEnterFrame()
    {
        myRectangle.x += moveX;
        myRectangle.y += moveY;
     
// теперь предотвратим выход прямоугольника за область отображения
        if( myRectangle.x > flash.Lib.current.stage.stageWidth - rectangleWidth -1)
            myRectangle.x = flash.Lib.current.stage.stageWidth - rectangleWidth -1;
        else if( myRectangle.x <    0 )
            myRectangle.x = 0;
        if( myRectangle.y > flash.Lib.current.stage.stageHeight - rectangleHeight -1)
            myRectangle.y = flash.Lib.current.stage.stageHeight - rectangleHeight -1;
        else if( myRectangle.y <    0 )
            myRectangle.y = 0;
    }
}

Результат:

Обратите внимание что сперва следует кликнуть на флеш передав ему фокус для перехвата событий ввода.

Внешнее изображение:

Я захотел добавить эту картинку в свое приложение:


Чтобы сделать это, я сперва сделал другой .swf который содержив все внешние ресурсы моего приложения.
В приложении используется swfmill.

Сперва создаем файл resource.xml что будет указывать какие ресурсы мы хотим включить в swfmill, и названия для идентификации этих ресурсов:
<?xml version="1.0" ?>
<movie version="9">
    <frame>
        <library>
            <clip id="men" import="men.png"/>
    </library>
    </frame>
</movie>

Создаем файл resource.swf используя команду swfmill simple resource.xml resource.swf.
Модифицируем compile.hxml для указания компилятору использовать resource.swf:
-main Tutorial
-swf-version 9
-swf-header 320:240:30
-swf-lib resource.swf
-swf tutorial.swf

Теперь можем писать код в Tutorial.hx:
class Tutorial
{
    static function main()
    {
        var s:flash.display.MovieClip = flash.Lib.attach("men"); // "men" название определенное в resource.xml
        flash.Lib.current.addChild(s);
    }
}

Результат:

Анимация:

Нынешней целью для нас является создание анимации используя следующие картинки:
 
Нам нужно модифицировать только наш ресурсный файл resource.xml, для создания сцены состоящей из 4 фреймов, каждый из которых использует одну картинку:
<?xml version="1.0" ?>
<movie version="9">
        <clip id="men1" import="men1.png"/>
        <clip id="men2" import="men2.png"/>
        <clip id="men3" import="men3.png"/>
    <frame>
        <library>
            <clip id="men">
                    <frame>
                    <place id="men1" depth="1"/>
                </frame>
                <frame>
                    <place id="men2" depth="1"/>
                </frame>
                <frame>
                    <place id="men3" depth="1"/>
                </frame>
                <frame>
                    <place id="men2" depth="1"/>
                </frame>
            </clip>
    </library>
    </frame>
</movie>
Как идентификатор "men" для сцены остался прежним, нам не нужно модифицировать наш Tutorial.hx, нужно только скомпилировать.
Результат:

Он пытается летать ? ;-)

Это конец туториала.
Теперь вы легко можете создавать легкие приложения используя haxe/Flash.
Обратите внимание что я не использовал ООП в коде, ввиду того что нужно было показать основы Flash.

Комментариев нет:

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