Как с помощью [embed] встроить swf с кодом
Мы знаем, что при встраивании swf с помощью тега [Embed] весь код, который был в swf-ке, утрачивается. Есть один способ как уберечь код.
Сначала создадим во Flash IDE флэшку, главным классом которой будет, например, assets.Flea. В этом классе сделаем метод startJumping(), который просто будет начинать проигрывание флэшки. Файл назовём flea.swf.
Теперь встроим flea.swf в какой-нибудь класс во Flex-проекте:
[Embed("assets/flea.swf", mimeType="application/octet-stream")]
private var FleaAsset:Class;
mimeType=”application/octet-stream” даёт понять компилятору Flex, что встраивание нужно проводит без никаких конвертаций.
Теперь во FleaAsset мы имеем класс ByteArrayAsset, т.е., практически ByteArray.
Далее загружаем экземпляр FleaAsset в Loader с помощью loadBytes():
var currLoader:Loader = new Loader(); var ldrContext:LoaderContext = new LoaderContext(false, ApplicationDomain.currentDomain); currLoader.loadBytes( new FleaAsset(), ldrContext );
ldrContext мы используем, что бы быть уверенными, что класс, который находиться в FleaAsset будет тем же самым, что и во Flex проекте.
Далее, что бы класс из FleaAsset появился для нашего использования нам нужно подождать один кадр. Это не очень хорошо, но как это обойти я не знаю.
var sprite:Sprite = new Sprite(); sprite.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
Далее, мы просто создаём экземпляр класса assets.Flea и используем его как хотим. Вся графическая часть, созданная во Flash IDE останется :)
import assets.Flea;
function enterFrameHandler(event:Event):void
{
var flea:Flea = new Flea();
addChild(flea);
flea.startJumping();
sprite.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
Я сделал пример библиотечки, которая может упростить работу с встроенными swf.
Что бы узнать больше, рекомендую почитать ещё следующее (на английском):
- Про тег [Embed] и про mimeType которые поддерживает Flex
- Про ApplicationDomain и зачем он нужен
- Немного про классы *Asset
- Пример встраивания XML
Таґи: application/octet-stream, ByteArrayAsset, Flash IDE, mimeType, [Embed]
27, 2008 в %I:%M %p
кул! рилі кул! :)
17, 2010 в %I:%M %p
Спасибо! После трех дней мучений я наконей решил проблему.
Неужели интеграция двух родственных платформ доложна быть настолько геморройной?..
17, 2010 в %I:%M %p
если грузить ассеты как внешний файл – геморроя немного меньше :)