flash

Разработка Flash-приложений действительно проста с Haxe. В качестве примера давайте создадим простое приложение HelloWorld.

HelloWorld

Самый простой пример, показывающий общую технику разработки Flash-приложений на Haxe.

Test.hx

Создайте следующий класс в файле с именем Test.hx.

class Test {
    static function main() {
        trace("Hello World !");
    }
}

compile.hxml

Создайте файл compile.hxml в той же директории, что и Test.hx и напишите в нём следующее:

-swf9 test.swf
-main Test

test.swf

Для компиляции Вашей первой программы на Haxe можно просто нажать двойным щелчком на файл compile.hxml, или же выполнить команду haxe compile.hxml в командной строке. Если в ходе компиляции возникнет какая-либо ошибка, Вы увидите её на экране.

Если при этом Вы получили ошибку "Standard library not found" или "Class not found : Test", удостоверьтесь, что Haxe нашёл файлы библиотек, распространяемых вместе с Haxe (содержимое папки std), и сам файл Test.hx. По умолчанию Haxe ищет эти файлы в текущей директории, подразумевая что Test.hx и std должны быть в директории, из которой запускается Haxe. Чтобы переназначить директорию, в которой ищутся классы, Вы можете определить переменную окружения HAXE_LIBRARY_PATH значением наподобие следующего: /home/mjs/local/lib/haxe/std:. (обратите внимание на двоеточие и точку в конце).

Если же в ходе компиляции Вы получили ошибку "Invalid class name -swf9 test.swf", то Вам следует изменить кодировку файла .hxml на ANSI.

test.html

Если всё прошло гладко, как и должно быть, то будет создан файл test.swf. Теперь Вам следует создать HTML-страницу test.html с таким содержимым:

<html>
<head><title>Haxe Flash</title></head>
<body bgcolor="#dddddd">
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
        width="400"
    height="300"
    id="haxe"
    align="middle">
<param name="movie" value="test.swf"/>
<param name="allowScriptAccess" value="always" />
<param name="quality" value="high" />
<param name="scale" value="noscale" />
<param name="salign" value="lt" />
<param name="bgcolor" value="#ffffff"/>
<embed src="test.swf"
       bgcolor="#ffffff"
       width="400"
       height="300"
       name="haxe"
       quality="high"
       align="middle"
       allowScriptAccess="always"
       type="application/x-shockwave-flash"
       pluginspage="http://www.macromedia.com/go/getflashplayer"
/>
</object>
</body>
</html>

Если Вы теперь откроете файл test.html в своём браузере, на экране должна отобразиться надпись Hello World и информация о файле и строке, в которой возникла операция trace.

N.B.: Этот пример использует один из наиболее часто используемых способов интегрирования Flash на веб-страничцу. На вопрос "почему" ответ можно найти в этой статье: Flash Embedding Cage Match.
Если Вам не нравится передавать параметры много раз, можете использовать JavaScript-библиотеку:

Рисование

В предыдущем примере мы использовали чистый Haxe, без функций, специфичных сугубо для Flash. Функция trace реализована по умолчанию таким образом, что она выведет отладочную информацию на экран. Давайте теперь посмотрим, как нарисовать квадрат на экране при помощи инструментов, специфичных для Flash. Для этого нам необходим контекст для рисования, имеющий во Flash название MovieClip. Модифицируйте код Test.hx следующим образом:

class Test {
    static function main() {
        var mc:flash.display.MovieClip = flash.Lib.current;
        mc.graphics.beginFill(0xFF0000);
        mc.graphics.moveTo(50,50);
        mc.graphics.lineTo(100,50);
        mc.graphics.lineTo(100,100);
        mc.graphics.lineTo(50,100);
        mc.graphics.endFill();
    }    
}

Этот код получает текущий мувиклип (в данном случае таковым будет корневой мувиклип Flash-ролика - прим.перев.) и использует Flash API для рисования прямоугольника на этом мувиклипе.

Выполните файл compile.hxml снова и откройте test.html, чтобы увидеть красный квадрат.

Использование Библиотеки

Во Flash все мультимедиа-ресурсы (графика, звуки, шрифты) обыкновенно хранятся в библиотеке (Library). Каждый такой ресурс может иметь свой идентификатор, linkage name. Когда Вы создаёте SWF-файл из библиотеки, используя Flash IDE или другие инструменты от сторонних разработчиков с открытым кодом, такие как рекомендуемые SwfMill и Sam Haxe, он будет содержать все ресурсы, к которым можно обратиться из Haxe по их linkage names.

К примеру, предположим, что Вы создали файл resource.swf, содержащий мувиклип с linkage name button. Внесите изменения в свой код, чтобы отобразить этот мувиклип на сцене:

Flash 8:

class Test {
    static function main() {
         var but = flash.Lib.current.attachMovie("button", "but001", 0);
         but._x = 10;
         but._y = 20;
    }
}

Flash 9:

class Test {
    static function main() {
         var but = flash.Lib.attach("button");
     flash.Lib.current.addChild(but);
         but.x = 10;
         but.y = 20;
    }
}

Этот пример создаёт экземпляр мувиклипа button из библиотеки на глубине 0 и с идентификатором but001 (может быть только один объект для каждого идентификатора и глубины). Далее, мувиклип перемещается в точку (10, 20) на экране.

Чтобы использовать нашу кнопку button, нам необходимо указать Haxe, чтобы он использовал файл resource.swf в качестве источника ресурсов. Для этого отредактируйте compile.hxml следующим образом:

-swf test.swf
-swf-lib resource.swf
-main Test

Теперь Вы можете выполнить compile.hxml, откомпилировав свой проект. Файл test.swf, созданный таким образом, будет включать в себя всё содержимое resource.swf, а также откомпилированный Haxe-код. Вы можете посмотреть на результат, открыв файл test.html.

Обратите также внимание на то, что test.swf будет иметь те же параметры (ширину, высоту, цвет фона, версию FlashPlayer'а и FPS), что и файл resource.swf, в то время как без файла ресурсов использовались бы параметры по умолчанию из Haxe. Однако большинство этих параметров (за исключением FPS и версии FlashPlayer'а) могут быть переопределены в HTML, как Вы можете видеть в нашем файле test.html.

Изменение параметров SWF

Параметры генерируемого SWF-файла могут быть изменены при помощи флага -swf-header в командной строке. Отредактируйте HXML следующим образом:

-swf test.swf
-main Test
-swf-header 200:300:40:FF0000

При этом размеры SWF станут 200x300 пикселей, и он будет работать на 40 FPS с красным цветом фона. Ещё раз обращаю внимание на то, что эти параметры могут быть переопределены в HTML.

Вы также можете указать версию FlashPlayer'а, для которой будет откомпилирован Ваш проект, используя флаг -swf-version в командной строке. Haxe будет обрабатывать этот параметр соответственно:

  • 6 версия : будет сгенерирован байт-код для Flash Player 6.0 (более медленный, поскольку не использует регистры). Flash API при этом остаётся доступным, поэтому следует быть осторожным, чтобы не использовать классы/методы API, не поддерживаемые этим FlashPlayer'ом.
  • 7 версия : будет сгенерирован байт-код для Flash Player 7, при этом отключается Flash 8 API
  • 8 версия : будет сгенерирован байт-код для Flash Player 8 (такой же, как для 7-й версии), но будет включено новое API из Flash 8
  • 9 версия : будет сгенерирован байт-код для Flash Player 9, при этом используется ActionScript3 API

Изменение параметров безопасности

Если Вы хотите, чтобы ваш локальный swf-файл имел доступ к сетевым ресурсам (а не к файловой системе), Вы можете указать в параметрах компиляции "security sandbox" swf-файла следующим образом:

-D network-sandbox

Получение переданных параметров (flashVars) и размеров сцены

Их определение зависит от того, каким образом Вы внедряете Flash на веб-страницу (техники внедрения Flash на страницу см. выше).

        var params:Dynamic<String> = flash.Lib.current.loaderInfo.parameters;
        // quick way to trace them all:
        trace("param named name is :" + params.name);
        trace(haxe.Serializer.run(params));

Не пропустите:
How to wait for population of flash vars (parameters and size)

Смотрите также следующую статью:
Using FlashVars with the LoaderInfo class

Указанное выше обсуждение не использует правильный способ ожидания готовности параметров, с использованием loaderInfo. Вместо того, чтобы ожидать состояния готовности, проверяя его по таймеру, можно подписаться на событие Event.INIT в объекте flash.Lib.current.stage.loaderinfo. Однако обработчик события может не быть вызван, если событие состоялось перед тем, как был установлен слушатель. Поэтому слушателя вообще не нужно ставить, если flash.Lib.current.stage != null и Std.is( flash.Lib.current.stage.stageWidth , Int ). В указанной выше статье используется метод проверки готовности по таймеру, который, возможно, более хорошо протестирована.

Целевые платформы

Команда

haxe --help | grep flash

показывает следующие полезные опции:
-swf <file> : compile code to Flash SWF file
-swf9 <file> : compile code to Flash9 SWF file
-swf-version <version> : change the SWF version (6 to 10)

Реальное их значение следующее:

-swf <file>   : compile code to Flash SWF file (код для AVM1)
-swf9 <file> : compile code to Flash9+ SWF file (код для AVM2) 
-swf-version <version> : change the SWF version (6 to 10). (при этом нужно, чтобы был задан -swf или -swf9)

где AVM1 - среда выполнения, используемая FlashPlayer'ом версии < 9 (базирующаяся на ActionScript 2.0 - прим.перев.), а AVM2 - среда выполнения, используемая FlashPlayer'ом версии >=9.

В результате для компиляции под Flash Player 10 Вам понадобится указать следующие (с виду немного противоречивые) параметры:

-swf9 output.swf -swf-version 10

Куда Двигаться Дальше

Теперь, когда Вы можете делать такие простые базовые вещи, всё, что Вам нужно - это изучить Flash API, необходимое для реализации Ваших приложений. Haxe достаточно консервативен касательно API (в том смысле, что API соответствует спецификации классического ActionScript - прим.перев.), поэтому Вам будет достаточно прочесть Adobe Livedocs for Flash 6-8 (см. "ActionScript Language Reference") или Adobe Livedocs for Flash 9/10 для получения полной информации.

Между Haxe Flash API и ActionScript 2 Flash API есть некоторые незначительные различия, перечисленные ниже:

  • Стандартные классы, такие как Date, Array, String могут иметь незначительные отличия в Haxe, поскольку они являются общими для всех Haxe-платформ. Смотрите документацию Haxe API для более детальной информации.
  • Классы XML и XMLNode слиты в один класс Xml, предоставляющий расширенное API.
  • Все базовые классы Flash, такие как MovieClip, TextField... находятся в пакете flash. Таким образом, Вам нужно использовать flash.MovieClip вместо MovieClip, или же добавить инструкцию import flash.MovieClip; в начале Вашего класса.
  • Используйте flash.Lib._root вместо _root, и flash.Lib._global вместо _global. flash.Lib.current используйте для доступа к локальному root-мувиклипу (отличается от _root, если данный SWF-файл был динамически загружен в другой SWF-файл).

Помимо этих минимальных отличий, Вы можете с лёгкостью использовать в Haxe все существующие функции Flash API, известные Вам.

version #10204, modified 2011-02-20 11:04:33 by antony