вторник, ноября 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"/]
...

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

8 комментариев:

Анонимный комментирует...

Я еще сталкиваюсь с проблемой, когда в клипе существует только шейповая анимация.
Экспортируешь swc - Flex Builder (проект AS3) выдает ошибку среды.

vapes комментирует...

Мувиклип от спрайта отличается только наличием тамлайна. И, если разработчик будет все создавать как мувиклипы - то это неправильный разработчик.

Unknown комментирует...

Позвольте представиться, Неправильный разработчик. :)

Ну честно признаюсь - лень мне писать в Base Class Sprite.
А тут еще и выясняется, что ленивым - почёт. Однофреймовый мувик ембедится как спрайт.

foreground комментирует...

2 Ventur
А решение какое?

Я вот щас только прочитал и уже ничуть не удивился )):
"You should be aware of the following restrictions when working with SVG files in Flex:

You can only embed an SVG file in an application; you cannot load one at run time
SMIL and animation are not supported
Masking and filters are not supported
Pattern Fill and some advanced Gradients are not supported
Interactivity and scripting is not supported
SVG text is rendered as nonsearchable and nonselectable SWF shape outlines, meaning it is not rendered as native text in Flash Player or AIR ".
после того как получил: "0 bytes after decompression".
Ну вобщем-то парсер уже сделал на коленке. И пришел к выводу, что хорошо бы иметь декодеры отдельно (единственная проблема без команды тут не обойтись).

Unknown комментирует...

> Ну вобщем-то парсер уже сделал на коленке
Я б для начала посоветовал поискать готовые парсеры. Например, http://code.google.com/p/as3svgrendererlib/

foreground комментирует...

>>Например, http://code.google.com/p/as3svgrendererlib/
я её глядел. . вроде. она не доделана толком..

Unknown комментирует...

Понял. Жалко.

foreground комментирует...

вот нашёл линки в тему:
http://www.alex-uhlmann.de/flash/animationpackage/ap3/index.htm
http://www.w3.org/Graphics/SVG/