Пятница, 29 Марта 2024, 17:17

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Adobe Flash и Создание флэш-игр » Подгрузка swf в swf
Подгрузка 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
частый гость
Сейчас нет на сайте
поставил проверку - все работает. спасибо. up
Форум игроделов » Конструкторы игр и лёгкие в освоении системы разработки игр » Adobe Flash и Создание флэш-игр » Подгрузка swf в swf
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг