Форум 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=197393)

BenderMTB 06.04.2013 17:25

Обращение к загруженному SWF
 
Здравствуйте.
Я загрузил SWF на сцену с помощью Loader. В событие Event.COMPLETE добавил его на сцену с помощью addChild. Подскажите пожалуйста как обратиться в загруженному SWF.
Например загруженный SWF состоит из нескольких кадров. При нажатие какой то кнопки в главном ролике мне нужно переплеснуть SWF на 1й кадр, при нажатие другой кнопки на 2й и тд.

Александр Мостовой 06.04.2013 18:06

В загружаемом swf есть код или только графика?


В флешплеере в целях безопасности для каждого класса исполняемого кода (а классы создаются автоматически даже в случае написания кода во фреймах) присвоено определенное свойство SecurityDomain


Может вам информация ниже покажется несколько запутанной, но рекомендую загружать медиаданные с loaderContect ом для текщего домена. А код всех классов используемых в загруженном клипе хранить в основном swf.

А именно:

1. СОздаете в родительском приложении файлы классов без привязки графики. (Не забудте оставить где-нибудь в коде ссылки на них, что бы компилятор включил их в swf)
2. Создаете в загружаемом ролике символы в библиотеке и привязывете привязывает в Linkage классы точно с таким же именем как в родительском( при этом положите fla файл в отдельную паку, что бы классы не подхватились из файлов, а компилятор должен ругнуться "не могу найти соответствующих файлов")
3. В родительском приложении загружаете swf с указанием loaderContext applicationDomain.currentDomain
Код AS3:

loadernew Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_completeHandler);
loaderContext = new LoaderContext(false, ApplicationDomain.currentDomain);
loader.load(request, loaderContext);

В этом случае все классы из родительского swf заменят одноименные классы в загруженном клипе, но при этом они подхватят всю графику из загруженного

Это вам позволит работать со всем пременными ссылками на экземпляры на сцене как буд-то бы они лежали на сцене в основном классе.

Если вам необходимо обращение только на уровне root загруженного ролика, то все это проделаете лишь для одного класса.
Более простые на первый взгляд решения на практике оказываются еще запутанней :)

Добавлено через 8 минут
Да еще в загружемом ролике в PublishingSettings в настройках ActionScript3 необходимо убрать галочку в "Automatically declare stage instances"

BenderMTB 06.04.2013 18:43

Чего то не работает. Всё ли я правильно сделал?
В загружаемых SWF убрал галочку "Automatically declare stage instances".
В главном ролике добавил несколько фрагментов для загрузки SWF. Фрагменты назвал object_lo_1, object_lo_2 и тд.

Фаили загружаю так:

Код AS3:

 var lr_url_req:URLRequest;
        var lr_loader:Loader;
        var lr_load_con:LoaderContext;
 
        var l_object_url:String;
 
        l_object_url = (root as MovieClip).get_object_url (i_object_type, i_object_group, i_object_n);
 
        lr_url_req = new URLRequest(l_object_url);
 
        lr_load_con = new LoaderContext(false, ApplicationDomain.currentDomain);
 
        lr_loader = new Loader();
        lr_loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loader_event_progress);
        lr_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_event_complete);
        lr_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loader_event_io_error);
        lr_loader.load(lr_url_req, lr_load_con);
 
function loader_event_complete(e:Event):void {
 
        var lr_loader:Loader;
 
        MovieClip(e.target.content).is_object_param = is_object_param;
        MovieClip(e.target.content).gotoAndStop(2);
 
        lr_loader = e.currentTarget.loader as Loader;
 
        lr_loader.x = - int( lr_loader.width / 2 );
        lr_loader.y = - int( lr_loader.height / 2 );
 
        gotoAndStop(3);
        object_cont_swf.addChild(lr_loader);
 
}

Потом пытаюсь обратиться к загруженным SWF:

Код AS3:

object_lo_1.object_cont_swf.gotoAndStop (2);

Но чего то не выходит…

Александр Мостовой 06.04.2013 19:09

Цитата:

Фрагменты назвал object_lo_1, object_lo_2
Нет, я имел ввиду не давать им имя, а назначить классы в свойствах клипа в библиотки (тогда бы вы смогли создавть новые клипы с графикой при помощи new MyElementClass()).

И не очень понял что подразумеваете под
Цитата:

добавил несколько фрагментов
Но если вы пишете код в кадрах, тогда нужно сделать лишь 2 вещи:
1. В загружаемом ролике в свойство документа поставить MyLodedApp.
2. А рядом с родительским роликом создать класс MyLodedApp, в котором описать переменные с именами инстансов лежащих на сцене в загружаемом ролике (если хи нет, то не нужно)

Код AS3:

package
{
        import flash.display.MovieClip;
 
        public class MyLodedApp extends MovieClip
        {
                public var instanceOnScene:MovieClip; //Переменные - имена инмтансов лежащих на сцене в загружаемом ролике. Если их нет, то не нужно
 
                public function MyLodedApp()
                {
                        super();
                }
        }
}

После загрузки графика подхватится из загруженного клипа, а код будет исполняться тот, который в классе, как если бы этот код был изначально в загруженном клипе

ПС. Для случая с кодом в кадрах впринципе можно придумать чуть проще без внешнего файла класса, а используя runtime shared librory, но я давно им не пользовался, поэтому предложу лишь указанное решение :)

Добавлено через 26 минут
А потом обратиться к загруженному классу следуюущим образом
Код AS3:

var loadedMC:MyLodedApp = lr_loader as MyLodedApp;
loadedMC.gotoAndStop (2);

Добавлено через 36 минут
Вообще, честно говоря, думаю большинству довольно сложно будет сориентироваться, т.к. привыкли к другому стилю програмирования и именования переменных
http://sourceforge.net/adobe/flexsdk...20Conventions/

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

BenderMTB 06.04.2013 20:00

Цитата:

Вообще, честно говоря, думаю большинству довольно сложно будет сориентироваться, т.к. привыкли к другому стилю програмирования и именования переменных
Стиль программирования и именования переменных действительно перетекли из другого языка (так как в основном программирую не на AC3). Спасибо за полезную ссылочку))

Поэкспериментировал и получилось прировнять созданный Фрагмент к загруженному фрагменту и в дальнейшем обращается к нему так как будто он был изначально на сцене.

то есть в событие Event.COMPLETE прописал следующее:

Код AS3:

object_cont_swf.addChild(lr_loader);
        object_cont_swf = MovieClip(e.target.content) // object_cont_swf - просто пустой фрагмент;

И в дальнейшем можно обращатся к загруженному SWF так:
Код AS3:

object_lo_1.object_cont_swf.gotoAndStop (2);

Не знаю на сколько это правильно, но вроде работает.


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

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