Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Волгоградец

Оценить эту запись

Embed клипа с одним кадром.

Запись от Волгоградец размещена 16.01.2012 в 13:55
Обновил(-а) Волгоградец 16.01.2012 в 13:58

Век живи, век учись. (старинная народная поговорка).

Привет, дорогой читатель. После моих статей о физике мне пришли (и продолжают приходить) сотни писем с просьбами продолжить рассказ (шучу конечно - никто мне не пишет ;(...). Но сегодня я расскажу о другом. Итак, кратко суть проблемы.

В один ничем не примечательный день, делаю я операцию, которую до этого делал, ну наверное раз 1000 - самый обычный эмбед символа из swf. Дал имя классу, указал базовый класс как flash.display.MovieClip. Далее накорябал такой код:
Код AS3:
[Embed(source="../lib/lib.swf", symbol="manyFramesClip")]//в этом клипе несколько кадров
private const _MANY_FRAMES_CLIP_CLASS:Class;
 
[Embed(source = "../lib/lib.swf", symbol = "oneFrameClip")]//в этом клипе ОДИН кадр
private const _ONE_FRAME_CLIP_CLASS:Class;
 
public function Main():void 
{
	var manyFramesClip:MovieClip = new _MANY_FRAMES_CLIP_CLASS();//OK
	var oneFrameClip:MovieClip = new _ONE_FRAME_CLIP_CLASS();//exception, information=TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать Main__ONE_FRAME_CLIP_CLASS@4cc5101 в flash.display.MovieClip.
}
ВТФ, подумал я и попробовал вот так:
Код AS3:
var oneFrameClip:Sprite = new _ONE_FRAME_CLIP_CLASS();//OK
Ладно, подумал я, и решил переписать все методы, которые принимают MovieClip на методы, которые принимают DisplayObject. Внутри этих методов я добавлял
Код AS3:
if(do is Sprite)
{
   doThis();
}
else if(do is MovieClip)
{
   doThat();
}
Спустя десять минут я ужаснулся от количества спагетти и решил вернуть все назад - теперь мои методы снова принимали MovieClip, а я искал в гугле решение проблемы. Там моментально нашлось 2 способа. Первый - это использовать Sprite, там где имеется клип с одним кадром. Этот вариант не прокатил (см. выше). Второй вариант - не делать клипов с одним кадром o_0 - делать все клипы минимум с двумя кадрами. Мне этот способ тоже чем-то не приглянулся (не могу объяснить - чем. Просто не понравился).

"Ладно, а что если заэмбедить всю свфку и уже оттуда дергать символы" - подумал я и руки мои уже стучали по клавиатуре, набивая заветные лексемы.
Код AS3:
[Embed(source = "../lib/lib.swf", mimeType = "application/octet-stream")]
private const _SWF:Class
 
public function Main():void 
{
	var loader:Loader = new Loader();
	loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeHandler);
	loader.loadBytes(new _SWF() as ByteArray);
}
 
private function completeHandler(event:Event):void 
{
	var info:LoaderInfo = event.target as LoaderInfo;
 
	var manyFramesClipClass:Class = info.applicationDomain.getDefinition('manyFramesClip') as Class;
	var manyFramesClip:MovieClip = new manyFramesClipClass();
	trace(manyFramesClip.totalFrames);//10
 
	var oneFrameClipClass:Class = info.applicationDomain.getDefinition('oneFrameClip') as Class;
	var oneFrameClip:MovieClip = new oneFrameClipClass();
	trace(oneFrameClip.totalFrames);//1
}
Вот собственно и все. Просто захотелось поделиться.
Всего комментариев 23

Комментарии

Старый 16.01.2012 14:04 КорДум вне форума
КорДум
 
Аватар для КорДум
О как. Эмбед отдельных клипов превращает однокадровые в спрайты... Интересно.
Старый 16.01.2012 14:38 in4core вне форума
in4core
 
Аватар для in4core
Саня а ты разве не знал? Я уже давно с этим сталкнулся, когда еще первую скиновалку делал
Старый 16.01.2012 14:49 GBee вне форума
GBee
 
Аватар для GBee
Можно без использования лоадера

Код AS3:
var obj:DisplayObjectContainer = new _SWF() as DisplayObjectContainer;
obj.addEventListener(Event.COMPLETE, onSkinLoaded);
 
private function onSkinLoaded(event:Event):void
{
	var loader:Loader = event.currentTarget.getChildAt(0) as Loader;
        //loader.contentLoaderInfo.applicationDomain
}
Старый 16.01.2012 14:55 КорДум вне форума
КорДум
 
Аватар для КорДум
Цитата:
Саня а ты разве не знал? Я уже давно с этим сталкнулся, когда еще первую скиновалку делал
Нет, никогда из swf Не эмбедил отдельно клип. Было незачем.
Старый 16.01.2012 15:07 Котяра вне форума
Котяра
 
Аватар для Котяра
Не пойму - баг это или фича.
Старый 16.01.2012 15:12 Jewelz вне форума
Jewelz
 
Аватар для Jewelz
> Можно без использования лоадера

класс, спасибо
Старый 16.01.2012 15:16 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
А я что-то не понял - как без лоадера?

Upd.: а, понял - без mimeType надо эмбедить. Прикольно - магия (кто диспатчит событие COMPLETE???!!!).
Обновил(-а) Волгоградец 16.01.2012 в 15:21
Старый 16.01.2012 15:19 GBee вне форума
GBee
 
Аватар для GBee
Цитата:
класс, спасибо
Нема на чему :о)
Старый 16.01.2012 15:19 cleptoman вне форума
cleptoman
 
Аватар для cleptoman
насколько помню, если маймТайп не указать, то свойство будет указывать на рут класс вашей ембед-свфки.
Старый 16.01.2012 15:19 GBee вне форума
GBee
 
Аватар для GBee
Цитата:
А я что-то не понял - как без лоадера?
Ну без loadBytes, лоадер уже есть.
Старый 16.01.2012 15:51 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Не пойму - баг это или фича.
Нормальное поведение.
Старый 17.01.2012 01:03 zuxul вне форума
zuxul
3 вариант - использовать SWC.
Или с SWC есть другие неудобства?
Старый 17.01.2012 01:38 in4core вне форума
in4core
 
Аватар для in4core
swc это совсем другая фича. и работать с ней совершенно по другому нужно
Старый 17.01.2012 10:31 zuxul вне форума
zuxul
Как по-другому? Весь смысл - достать графику, нарисованную в флеше. С помощью swc это делать гораздо удобнее.
Старый 17.01.2012 11:02 HardCoder вне форума
HardCoder
 
Аватар для HardCoder
Цитата:
С помощью swc это делать гораздо удобнее.
Не подумайте, что стараюсь оспаривать. В чем удобства?
Старый 17.01.2012 14:36 in4core вне форума
in4core
 
Аватар для in4core
Что бустрее и удобнее это он все верно сказал. Зато рантайм не погрузишь
Старый 17.01.2012 14:48 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Зато рантайм не погрузишь
Можно и рантайм.
Старый 17.01.2012 14:55 zuxul вне форума
zuxul
Цитата:
В чем удобства?
- достаточно просто добавлять новую графику - только добавить файл и прописать библиотеки (для fd - это два клика мышкой)
- в самих символах видны некоторые составляющие - например, нужно прописать в графике <intance name> и в коде мы получим публичный элемент с таким именем

Я не имею ничего против embed, всегда пользуюсь им когда нужно быстро что-то сделать. Еще можно с его помощью и с помощью компановщика (если не ошибаюсь comp) скомпилировать библиотеку из файлов изображений.

Цитата:
Зато рантайм не погрузишь
in4core здесь так-то разговор был про embed - что как бы тоже в рантайме не погрузишь

alatar как?
Старый 17.01.2012 14:58 zuxul вне форума
zuxul
А вспомнил, где-то были 3 крутые статьи про swc...
вот она статья: http://www.flasher.ru/forum/blog.php?b=317
Все, не буду больше не по теме писать...
Обновил(-а) zuxul 17.01.2012 в 15:04
Старый 17.01.2012 15:10 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
Цитата:
alatar как?
Загрузить swc разархивировать и загрузить library.swf. Поидее должно сработать.
Старый 17.01.2012 16:12 in4core вне форума
in4core
 
Аватар для in4core
Inet_PC ну это же шаманство) проще же тогда тупо swf грузить - ибо толку от свс никакого тогда нету
Старый 17.01.2012 16:56 alatar вне форума
alatar
 
Аватар для alatar
Цитата:
Загрузить swc разархивировать и загрузить library.swf. Поидее должно сработать.
Загрузить library.swf в прелоадере (в первом кадре). swc подключать как external или RSL.
Обновил(-а) alatar 17.01.2012 в 18:08
Старый 17.01.2012 18:20 Inet_PC вне форума
Inet_PC
 
Аватар для Inet_PC
alatar Ваш вариант гораздо лучше без сомнения.
 

 


Часовой пояс GMT +4, время: 18:05.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.