понедельник, ноября 17, 2008

Модульность Flex-приложения

Интересный вопрос был поднят недавно: Модульность приложения и размер swf. Ключевая фраза: "бред, закачивать классы, которые уже закачаны."
Тему раскрывает kuril:
"Все просто, сначала компилируется главное приложение с параметром - link-report=report.xml потом каждый модуль с параметром -load-externs=report.xml Таким образом классы которые уже имеются в главном приложении, не будут включены в модуль. http://livedocs.adobe.com/flex/3/html/help.html?content=modular_4.html"

вторник, ноября 04, 2008

Embed MovieClip не всегда дает MovieClip. AS3

Столкнулся с любопытной ситуацией (компиляция осуществляется Flex SDK 3, FlashDevelop):
Создаю клип в один фрейм. Объявляю его в Linkage как Base class = "flash.display.MovieClip".
Внедряю в код:
[Embed(source="Assets/screens.swf", symbol="SIntroScreen")]
public static var INTRO_CLASS:Class;

Пытаюсь работать с ним как с MovieClip:
var test:MovieClip = new Embeds.INTRO_CLASS();
Получаю исключение: "Type Coercion failed ..." Позвольте, позвольте!
Смотрим, что говорит нам describeType:
var test:DisplayObject = new Embeds.INTRO_CLASS();
trace(describeType(test));

А говорит он вот что (опускаю излишние подробности и заменяю треугольные скобки на квадратные):
[type name="classes::Embeds_INTRO_CLASS" base="mx.core::SpriteAsset" isDynamic="false" isFinal="false" isStatic="false"]
[extendsClass type="mx.core::SpriteAsset"/]
[extendsClass type="mx.core::FlexSprite"/]
[extendsClass type="flash.display::Sprite"/]
[extendsClass type="flash.display::DisplayObjectContainer"/]
[extendsClass type="flash.display::InteractiveObject"/]
[extendsClass type="flash.display::DisplayObject"/]
[extendsClass type="flash.events::EventDispatcher"/]
[extendsClass type="Object"/]
...

Так значит, при компиляции, однофреймовые MovieClip-ы без моего согласия (а может быть, согласно какому-то параметру по умолчанию), урезаются до Sprite-ов.
И верно, добавив еще один фрейм и скомпилировав, получаем:
[type name="classes::Embeds_INTRO_CLASS" base="mx.core::MovieClipAsset" isDynamic="false" isFinal="false" isStatic="false"]
[extendsClass type="mx.core::MovieClipAsset"/]
[extendsClass type="mx.core::FlexMovieClip"/]
[extendsClass type="flash.display::MovieClip"/]
[extendsClass type="flash.display::Sprite"/]
[extendsClass type="flash.display::DisplayObjectContainer"/]
[extendsClass type="flash.display::InteractiveObject"/]
[extendsClass type="flash.display::DisplayObject"/]
[extendsClass type="flash.events::EventDispatcher"/]
[extendsClass type="Object"/]
...

Вот такие чудеса творит оптимизация. В принципе, разумно конечно. Но только если знать про наличие такой фичи. В ином случае (как раз моем), добавочное время на разбор подводных камней обеспечено.