Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблемный класс во внешнем SWF (http://www.flasher.ru/forum/showthread.php?t=141953)

Xpb7 08.07.2010 19:00

Проблемный класс во внешнем SWF
 
Вложений: 1
Добрый день!
Возникла проблема слудющего характера. Подргужая внешнюю библиотеку в виде swf с классом внутри, главный SWF не находит этот класс ( причем ~ в 49 случаев из 50! ) в ней.:

Уверен, что пытаюсь сделать это правильно, так как если удалить этот класс со всеми потрохами ( он несколько многоуровневый и содержит другие классы внутри ) и заменить его простым, то главный SWF находит простой класс очень легко.

Чтобы наглядно показать ситуацию, я выдрал этот проблемный класс из проэкта, с его nтестовым лоадером и приложил к посту (cs5).
Main.swf грузит в себя bottomPanel.swf, пытаясь выдрать [BottomPanel] с помощью
Код AS3:

loader.contentLoaderInfo.applicationDomain.getDefinition('BottomPanel') as Class

но обламывается!

Пожалуйста, кто встречался с такой бедой, подскажите в чем может быть дело?!

Xpb7 09.07.2010 13:08

Люди, очень извиняюсь за то, что поднимаю тему, но этот вопрос достаточно критичен для меня. Я даже выложил исходник, чтобы можно было быстро узреть проблему! Нужели никто из гуру не знает ответа?

alexberkut 09.07.2010 13:19

getDefinition('BottomPanel')

ты ничего не добъешься, тк флеш ещё может не распарсил swf и не поднял классы.
Почитай про RSL (Runtime Shared Library). Может решит проблему

wvxvw 09.07.2010 16:14

А нельзя это как-то без FLA оформить, а то так даже не понятно в чем проблема...

Xpb7 09.07.2010 17:41

В смысле "без fla оформить"? Проблема в том, что класс описанный внутри одного подргужаемого swf, не может быть создан. Копаю в сторону Runtime Shared Library, но пока безуспешно. Примеры найденные мной работают, но как только я пытаюсь повотрить это с моим классом "BottomPanel" - fail.

wvxvw 09.07.2010 18:00

Ну вот например нету у меня Flash CS - не получится у меня вам помочь при всем желании, т.как я не знаю, что там у вас в этих FLA файлах. Судя по тому, что есть в SWF вы используете какие-то fl.* компоненты, а что вы с ними делаете - я понятия не имею, и декомпилировать не хочется.

Zebestov 09.07.2010 18:18

при подгрузке внешнего swf:

1. контекст явно указываешь?
2. на какое событие подписываешься?

mayakwd 09.07.2010 18:37

Перенесите всё в классы (графику используйте только как asset'ы), добавляйте её в классах и используйте в классах.
Не приписывайте через flash-ide мувиклипам какие-либо классы, вся проблема у вас в этом. Вообще используйте fla только как контейнер для графики (чтобы её править внутри и всё).

У flash-ide очень странное поведение при подобном распределении функциональности мувиклипов.

Добавлено через 9 минут
если после загрузки подождать от 3 до 5 фреймов то ваш класс найдется.

проблему эту я до сих пор и не понял потому что init вызывается раньше комплита у loaderInfo, но после инита недоступны методы, код и объявленные классы. по прошествию же 5 фреймов легко можно их забрать.

Добавлено через 15 минут
Код AS3:

package 
{
        import flash.display.*;
        import flash.display.Sprite;
        import flash.display.Loader;
        import flash.system.ApplicationDomain;
        import flash.net.URLRequest;
        import flash.events.*;
        import flash.system.LoaderContext;
 
        public class Main extends Sprite
        {
                private var loader:Loader;
                private var appDomain:ApplicationDomain;
 
                public function Main()
                {
                        var url1:URLRequest = new URLRequest('bottomPanel.swf');
                        trace( "main!" );
 
                        appDomain = new ApplicationDomain();
 
                        loader = new Loader();
 
                        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onloaderComplete);
                        loader.contentLoaderInfo.addEventListener(Event.INIT, onInit);
                        loader.load(url1,new LoaderContext(false,appDomain));
                }
 
                private var cont : DisplayObject;
 
                private function onloaderComplete(e:Event):void
                {
                        cont = loader.content;
                        trace ("hasDefinition after Complete: "+ (cont.loaderInfo.applicationDomain.hasDefinition("BottomPanel")));
                        this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);
                }
 
                private function onInit (e : Event) : void {
                        cont = loader.content;
                        trace ("hasDefinition after Init: "+ (cont.loaderInfo.applicationDomain.hasDefinition("BottomPanel")));
                }
 
                private var currFrame:uint = 0;
 
                private function enterFrameHandler(event : Event):void
                {
                        if (currFrame++ < 5)
                        {
                                return;
                        }
                        else
                        {
                                trace ("hasDefinition after 5 frames: "+ (cont.loaderInfo.applicationDomain.hasDefinition("BottomPanel")));
                                this.removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
                                if (loader.contentLoaderInfo.applicationDomain.hasDefinition("BottomPanel"))
                                {
                                        var BottomPanelClass:Class = loader.contentLoaderInfo.applicationDomain.getDefinition('BottomPanel') as Class;
                                        var bottomPanel:Object = new BottomPanelClass();
                                        trace( 'done' );
                                }
                                else
                                {
                                        trace("BottomPanel has not found");
                                }
                        }
                }
        }
}


Zebestov 09.07.2010 19:02

mayakwd, прямо не знаю что сказать.
скомпилил в отдельную swf графику, привязал к ней классы прямо во Flash IDE, добавил еще пару классов. подгружаю все это обычным способом, явно указываю контекст, жду INIT-а и сразу же использую классы из подгруженного swf.

что я делаю не так?

mayakwd 09.07.2010 19:04

скомпильте то что у человека и проверьте =)
у меня поведение точно такое же как и у него. после ожидания 3-5 фреймов все работает. я не знаю что вы делаете не так и что я делаю не так.

Zebestov 09.07.2010 19:21

делайте как я =)

Код AS3:

private function loadSWF():void
{
        var        loader:Loader = new Loader();
                loader.load(new URLRequest('http://...'), new LoaderContext(false, ApplicationDomain.currentDomain, SecurityDomain.currentDomain));
                loader.contentLoaderInfo.addEventListener(Event.INIT, this.onInitHandler);
}
...
private function onInitHandler(e:Event):void
{
        var test:Class = ApplicationDomain.currentDomain.getDefinition('SomeClassFromLoadedSWF') as Class;
}

может быть это "с фанатизмом", зато не имею ваших проблем :quiet:

mayakwd 09.07.2010 19:23

так все делают =) я не использую flash ide поэтому проблем у меня нет никаких.

Zebestov 09.07.2010 19:25

Цитата:

Сообщение от mayakwd (Сообщение 921131)
так все делают =)

только, я вижу, не у всех получается ;)

Xpb7 09.07.2010 19:30

Большое спасибо, видимо действительно не стоит экспортировать классы во flash IDE таким способом, и действительно через 5 фрэймов всё работает, что довольно странно. Придётся немного менять концепцию использования SWF как библиотек.

Zebestov 09.07.2010 19:34

абздольц )

dimarik 10.07.2010 15:11

Цитата:

Сообщение от Xpb7 (Сообщение 921138)
... классы во flash IDE таким способом, и действительно через 5 фрэймов всё работает ...

CS5 тормоз? ))
Эм. Так трех или пяти кадров нужно ждать?
Кстати, init должно срабатывать раньше complete.

Xpb7 12.07.2010 18:46

На самом деле хватило 30 милимекунд, не в том дело 3 или 5 фрэймов ждать, а факт в том, что лушче не экспориторовать классы во Flash IDE так, как это сделал я.
Всем большое спасибо, тему можно закрывать.

Zebestov 12.07.2010 19:01

Цитата:

Сообщение от Xpb7 (Сообщение 921697)
На самом деле хватило 30 милимекунд, не в том дело 3 или 5 фрэймов ждать, а факт в том, что лушче не экспориторовать классы во Flash IDE так, как это сделал я.

великолепный финал для асинхронного AS3, усыпанного событиями на любой вкус, но при этом в данной задаче требующего возвращения в каменный век и установки таймера 0о

мне одному это кажется какой-то фигней?

Mitya_Potemkin 16.11.2010 16:35

mayakwd красавчик, спасибо за код. очень помог)

Dukobpa3 17.11.2010 11:52

//*********

вторую страницу не заметил)))

ну раз уж пишу то:

1. Я всегда привязываюсь к комплиту, а не к иниту, ибо поидее он(комплит) позже реагирует.
2. на события подписываюсь всегда после(а не до) того как вызвал loader.load();

cleptoman 17.11.2010 12:51

2 - и что это дает? (если не брать во внимание тот факт, что можете не успеть поймать событие, в теории)

Dukobpa3 17.11.2010 15:36

Ну теория или нет, но просношавшись с прелоадером без малого сутки из-за такой простой херни меня научило...

Прелоадер доигрывал и через раз выдавал ошибку не найденного класса Main.

gloomyBrain 17.11.2010 16:09

Цитата:

на события подписываюсь всегда после(а не до) того как вызвал loader.load();
Лучше делать это до начала загрузки - так оно логичнее. То, что вы называете "научило" - есть неверный подход.


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

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