| « Debug mode для FDT 3 | Flash Platform: User-группы » |
RSL в ActionScript Project: разделяемый между приложениями код
Ситуация: в проекте несколько приложений, которые используют общий, довольно независимый код.
Например: серия игр, использующих 2D-движок APE или несколько видов сайта (главная, почта, чат), которые используют общие классы для работы с сервером статистики.
Проблема: каждая .swf содержит в себе этот код.
- Это увеличивает их размер
- При модификации этого кода нужно перекомпилировать все зависящие от него приложения (например, при изменении способа обращения к серверу)
Решение: вынести этот код в отдельный подгружаемый модуль. Во Flex для этого есть Runtime Shared Library (RSL), однако в ActionScript Project вам придется написать часть этой функциональности самому.

Это фишка именно Flex Framework. RSL-библиотеки подгружаются на этапе прелоадера: в классе mx.preloaders.Preloader есть методы, отвечающие за их загрузку. Какие RSL использовать и как их подключать (включить в код, подгружать в runtime) можно указать в меню Properties проекта. Flex также проверяет RLS-библиотеки на совместимость с текущей версией главного файла - для этого используются xml-манифесты - описания содержимого библиотеки. У нас этого нет, но мы с Вами можем реализовать, например, шифрование библиотек (если надо).
В ActionScript Project это нужно делать самому. Это нужно сделать прозрачно для приложения, т.е. все удобства работы с классами должны сохраниться:
- Подсказки в редакторе
- Использование ресурсов библиотеки без каких-либо проверок на загруженность (напр. классов или графики)
- Ничего не проверять и не загружать руками в каждом проекте отдельно
Создадим ActionScript Project, результирующий .swf которого будет содержать библиотеку ape.swc (воспользуемся опцией компилятора -include-libraries)
В наш основной проект также добавим эту библиотеку как .swc, однако выберем для нее Link Type: External (в ActionScript Build Path -> Library Path -> ape.swc -> Link Type), таким образом компилятор будет учитывать эти классы при компиляции, но не включит в .swf .
Выходной .swf проекта-обертки будем подгружать в прелоадере других основных проектов, до начала выполнения основных классов. Для каждого приложения будет собственный прелоадер, наследующий от класса DefaultPreloader (в нем - вся логика подгрузки и запуска). В конкретном прелоадере MyAppPreloader extends DefaultPreloader нужно будет указать массив адресов библиотек и имя главного файла приложения.
После этого в конструкторе главного класса приложения MyApp.as можно использовать все классы библиотеки, при этом они не включены в .swf проекта.
Пример на основе APE: на сайте можно скачать бинарный код ape.swc, но мы не можем загружать .swc файлы - только .swf .
Структура примера:
- PortalProto.swf - 3 kb
- UserProfile.swf - 5 kb
- lib/APE.swf - 20 kb
1. Создадим проект-обертку для ape.swc:
- Создаем обычный ActionScript Project, назовем APE
- Теперь нужно, чтобы система включила lib/ape.swc в APE.swf: добавим в ActionScript Compiler -> Additional compiler options -include-libraries “../lib/ape.swc” (путь к ape.swс относительно главного класса приложения APE.as)
Теперь у нас есть APE.swf, который содержит в себе все необходимые классы.
2. Создадим ActionScript проект SomeGame, cкопируем файл APE.swf в его папку bin/lib/. Создадим прелоадер, для этого напишем:
- package {
- // Импорты убраны для экономии места,
- // в коде их нужно дописать
- [SWF(width="800", height="600", backgroundColor="0xFFFFFF")]
- [Frame(factoryClass="SomeGamePreloader")]
- public class PortalProto extends Sprite
- {
- public function PortalProto()
- {
- trace("PortalProto::PortalProto");
- addEventListener(
- Event.ADDED_TO_STAGE,
- addedToStageHandler);
- }
- protected function init():void
- {
- stage.frameRate = 60;
- addEventListener(Event.ENTER_FRAME, run);
- APEngine.init(1/4);
- APEngine.container = this;
- APEngine.addMasslessForce(new Vector(0,2));
- // Добавим элементы в движок
- // ...
- }
- // events handler
- protected function addedToStageHandler
- (event:Event):void
- {
- init();
- }
- protected function run(event:Event):void {
- APEngine.step();
- APEngine.paint();
- }
- }
- }
Обратите внимание на строчку [Frame(factoryClass="SomeGamePreloader")] - таким образом мы создаем структуру из двух кадров - сначала грузится класс SomeGamePreloader, который показывает процесс загрузки приложения и его библиотек. Код для SomeGamePreloader:
- package
- {
- public class SomeGamePreloader extends DefaultPreloader
- {
- public function SomeGamePreloader()
- {
- // Вызовем конструктор DefaultPreloader с
- // параметрами - массив адресов библиотек
- // и именем главного класса проекта
- super(["lib/APE.swf"], "SomeGame");
- }
- }
- }
Класс DefaultPreloader (код) обеспечивает всю логику загрузки библиотек, создания экземпляра главного класса приложения и добавления его на сцену.
Трекбек адрес этой записи
URL трекбека (щелкните правой кнопкой мыши и скопируйте ссылку)
2 комментариев
->
APEngine.init(1/4);
APEngine.container = this;
APEngine.addMasslessForce(new Vector(0,2));




