Подгрузка swf в swf
|
|
TreinDSM | Дата: Понедельник, 05 Ноября 2012, 14:48 | Сообщение # 21 |
почетный гость
Сейчас нет на сайте
| Ну например завести в родительском приложение отдельный класс, представляющий чисто отображение всего приложения, какой-нить mainView. Объект этого класса всегда присутствует на сцене. Визуальный интерфейс самого приложения, скажем appView добавляется в качестве child'a в mainView. Когда приложение инициирует загрузку другой swf'ки и добавление ее на сцену оно удаляет свой визуальный интерфейс appView из mainView и добавляет туда загруженную swf-ку. Когда же приходит пора удалить загруженный клип, то верни appView обратно на сцену mainView.
|
|
| |
smit1987 | Дата: Понедельник, 05 Ноября 2012, 18:57 | Сообщение # 22 |
частый гость
Сейчас нет на сайте
| чёт я запутался..)
|
|
| |
TreinDSM | Дата: Понедельник, 05 Ноября 2012, 19:08 | Сообщение # 23 |
почетный гость
Сейчас нет на сайте
| У Вас есть исполняемая swf-ка, которая подгружает в себя другую swf-ку через loader. Если Вы хотите, чтобы после добавлении loader на сцену в отображении не присутствовали элементы из родительской swf-ки, то их надо удалить со сцены.
|
|
| |
smit1987 | Дата: Понедельник, 05 Ноября 2012, 19:51 | Сообщение # 24 |
частый гость
Сейчас нет на сайте
| Эт понятно, просто как это все прописать? Просто у меня еще много таких подгрузок на одной странице.
|
|
| |
TreinDSM | Дата: Понедельник, 05 Ноября 2012, 20:08 | Сообщение # 25 |
почетный гость
Сейчас нет на сайте
| Я ж не знаю, как там у Вас все завязано. Можно например вот так: Code package { import flash.display.Sprite; import flash.events.Event;
/** * ... * @author Dima */ public class Main extends Sprite { private var _app:AppControl = null; // public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); }
private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point
_app = new AppControl(); this.addChild(_app.view); _app.init(); }
}
}
Code package { import flash.display.DisplayObject; import flash.display.Sprite; /** * ... * @author Dima */ public class AppControl { private var _mainView:Sprite = new Sprite(); private var _appView:AppView = new AppView(); // private var _manager:SwfManager = new SwfManager(); // private var var _curView:DisplayObject = null; // public function AppControl() {
} // public function init():void { _mainView.addChild(_appView); _curView = _appView; } // private function newSwfToScene(url:String):void { if (_curView) { if (_curView.parent) { _curView.parent.removeChild(_curView); } } _curView = _manager.getNewSwf(url); _mainView.addChild(_curView); } // private function toMainView():void { if (_curView) { if (_curView.parent) { _curView.parent.removeChild(_curView); } } _curView = _appView; _mainView.addChild(_curView); } // public function get view():Sprite { return(_mainView); } }
}
Code package { import flash.display.DisplayObject; import flash.display.Loader; import flash.net.URLRequest; /** * ... * @author Dima */ public class SwfManager {
public function SwfManager() {
} // public function getNewSwf(url:String):DisplayObject { var loader:Loader = new Loader(); loader.load(new URLRequest(url)); return(loader); } }
}
newSwfToScene и toMainView вызывайте, когда нужно грузить новую swf-ку или вернуться к основному отображению.
Код, понятно, упрощенный, но общий принцип в общем-то рабочий.
|
|
| |
smit1987 | Дата: Понедельник, 05 Ноября 2012, 21:20 | Сообщение # 26 |
частый гость
Сейчас нет на сайте
| Завязанно там просто. На каждой кнопке висит такая штука. Вроде получается, что не связанны никак. Пока с ними не разберусь, ничего больше не делаю.
Code button.addEventListener(MouseEvent.CLICK, fl_ClickToLoadUnloadSWF);
import fl.display.ProLoader; var fl_ProLoader:ProLoader;
var fl_ToLoad:Boolean = true;
function fl_ClickToLoadUnloadSWF(event:MouseEvent):void { if(fl_ToLoad) { fl_ProLoader = new ProLoader(); fl_ProLoader.load(new URLRequest("ссылка")); addChild(fl_ProLoader); } else { fl_ProLoader.unload(); removeChild(fl_ProLoader); fl_ProLoader = null; } fl_ToLoad = !fl_ToLoad; }
|
|
| |
TreinDSM | Дата: Понедельник, 05 Ноября 2012, 22:09 | Сообщение # 27 |
почетный гость
Сейчас нет на сайте
| У Вас код в кадре timeline'a что ли? Писать хоть сколько-нибудь сложный код в кадре достаточно проблематично. Все-таки это больше для каких-нибудь скриптовых команд - запустить анимацию по щелчку, перейти в нужный кадр, спрятать объект.
Если не хотите менять, то можете, например, по добавлению загруженной swf-ки пробегаться по всем символам на сцене основной флешки и скрывать их. Можно по instance name символов: Code button.visible = false;
Можно по child'ам: Code var i:int = 0; while(i<this.numChildren) { this.getChildAt(i).visible = false; i++; } Естественно во втором случае это нужно делать до добавления лоадера на сцену иначе его тоже скроет. Когда нужно все вернуть обратно - убираете лоадер и проводите ту же операцию, только вместо visible = false, visible = true.
Но еще раз повторюсь, все это весьма не комильфо и дурной тон.
|
|
| |
smit1987 | Дата: Среда, 07 Ноября 2012, 03:59 | Сообщение # 28 |
частый гость
Сейчас нет на сайте
| А возможно как-нибудь вывести подгруженное swf в окне или что-то типо того? Просто сцену тут очистить мало. Размеры родительского файла намного больше, подгружаемого. Вылазят куски, которые должны быть спрятанны и иногда анимация разбегается по всему окну.. Добавлено (07.11.2012, 03:59) --------------------------------------------- Как в игре "Легенды Flash" в контакте - куча разных игрушек и все запускаются в окне. Ничего не мешает.
|
|
| |
TreinDSM | Дата: Среда, 07 Ноября 2012, 10:02 | Сообщение # 29 |
почетный гость
Сейчас нет на сайте
| Легенда Flash, почти как и всякая профессиональная игра в социалке - комплексный проект, который включает в себя некоторый удаленный сервер, javaSciript-овый интерфейс, в который встраивается флешка и саму флешку. Флешка тоже составная. Есть некоторый флешовый загрузчик, который встраивается в ExternalInterface. Цель данного загрузчика проста - подгрузить в себя управляющую флешку и визуализировать процесс загрузки. Когда загрузка завершена, загрузчик добавляет управляющую флешку себе на сцену (естественно из своего отображения все лишнее убирает). Дальше всем занимается управляющая флешка. Она получает данные о доступных играх и выдает их пользователю в виде некоторого меню. Когда пользователь выбирает некоторую игру, управляющая флешка убирает ставшее не нужным меню (не себя, а меню) и подгружает нужную игру. После подгрузки, она добавляет себе на сцену подгруженную игру. Когда пользователь выходит обратно в меню, управляющая флешка убирает контейнер с игрой и возвращает контейнер с меню.
Упрощенно, такая схема. В реальности естественно, процесс сложнее, так флешка достаточно активно работает с javaSciript-овый интерфейсом.
Само собой разумеется, что игра не создавалась путем написания кода в кадре (еще раз повторюсь сложный разветленный код писать в кадре достаточно проблематично). С учетом бедности графики управляющего приложения, не удивлюсь, если он реализован полностью программным методом.
|
|
| |
smit1987 | Дата: Четверг, 08 Ноября 2012, 00:49 | Сообщение # 30 |
частый гость
Сейчас нет на сайте
| Вот что мне ответили разработчики легенды:"после загрузки swf можно менять его размер и положение но это нужно сделать в момент окончания загрузки, там есть специальные события для этого". Но что за события, не пояснили..
|
|
| |
TreinDSM | Дата: Четверг, 08 Ноября 2012, 09:57 | Сообщение # 31 |
почетный гость
Сейчас нет на сайте
| События сами по себе ничего не делают, они лишь сигнализируют о различных ситуациях.
Если Вам нужно события окончание загрузки, то подписаться на него можно так:
var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteListener);
Сообщение отредактировал TreinDSM - Четверг, 08 Ноября 2012, 09:58 |
|
| |
smit1987 | Дата: Среда, 21 Ноября 2012, 18:54 | Сообщение # 32 |
частый гость
Сейчас нет на сайте
| Если на одну кнопу вешаешь сразу несколько уплоадеров,Code fl_ProLoader.unload(); fl_ProLoader_2.unload(); то срабатывает только первый. Как бороться?
|
|
| |
TreinDSM | Дата: Среда, 21 Ноября 2012, 19:58 | Сообщение # 33 |
почетный гость
Сейчас нет на сайте
| smit1987, Как Вы их вешаете? Точно ли существует fl_ProLoader_2, когда Вы вызываете метод unload?
|
|
| |
smit1987 | Дата: Четверг, 22 Ноября 2012, 19:40 | Сообщение # 34 |
частый гость
Сейчас нет на сайте
| У меня на странице, несколько кнопок с плоадерами. В них же лежать унлодеры. Т.е. второе нажатие на кнопку - глушит флешку. Но это не удобно. Я хочу сделать одну кнопку унлоад на всех. Проблема как я понял, состоит в том, что строчки исполняются поочереди и если к примеру первый проадер не загружен, то вторая и дальше по списку - не сработают.. Вот сейчас пытаюсь подобрать инструкцию, которая бы позволила исполнять все блоки, независимо от возможностей.
|
|
| |
TreinDSM | Дата: Четверг, 22 Ноября 2012, 20:33 | Сообщение # 35 |
почетный гость
Сейчас нет на сайте
| smit1987, Я бы завел массив лоадеров, в который бы добавлял те лоадеры, в которые что-то загружаем или загружали, а потом бы чистил бы их одним махом. Code var _loaders:Vector.<Loader> = new Vector.<Loader>(); // Заполнили наш массив // function clearLoaders():void { for each(loader:Loader in _loaders) { if(loader) { loader.unload(); } } _loaders.length = 0; }
Ну или просто проверяй перед очисткой свои лоадеры: Code if(fl_ProLoader) { fl_ProLoader.unload(); } if(fl_ProLoader_2) { fl_ProLoader_2.unload(); }
|
|
| |
smit1987 | Дата: Пятница, 23 Ноября 2012, 02:38 | Сообщение # 36 |
частый гость
Сейчас нет на сайте
| поставил проверку - все работает. спасибо.
|
|
| |