PDA

Просмотр полной версии : Обращение в функциям основного клипа из подгруженного swf


L_Ghost
13.04.2011, 17:59
Доброго времени суток!
Ситуация такая:
В основной ролик загружаю внешний swf через addChild(mc).
Далее из этого внешнего swf мне нужно обратиться к функциям и свойствам основного ролика.
Как это сделать?

_sestra_
13.04.2011, 18:25
В основной:

var loader:Loader = new Loader();
loader.load(new URLRequest("url"));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);

function onComplete (e:Event):void
{
// передаем внешней SWF ссылку на себя
e.target.content.parent = this;
}
function MyFunction ():void
{
trace('goal');
}


Во внутренней:
function set parent (object:DisplayObject):void
{
object.MyFunction();
}

Вкратце так.

gloomyBrain
13.04.2011, 18:40
e.target.content.parent = this;

Эмм?.. это как? И откуда у loaderInfo свойство content?

_sestra_
13.04.2011, 18:44
Эмм?.. это как? И откуда у loaderInfo свойство content?

Здрасте приехали:
Пакет flash.display
Класс public class LoaderInfo
Наследование LoaderInfo EventDispatcher Object
...
content : DisplayObject
[только для чтения] Загруженный объект, связанный с данным объектом LoaderInfo.

это:
e.target.content.parent = this;
заменить на это:
e.target.content.setParent(this);
если уж на то дело пошло )

Котяра
13.04.2011, 18:57
бред какой-то

_sestra_
13.04.2011, 18:59
бред какой-то

Содержательный комментарий

gloomyBrain
13.04.2011, 19:12
Сори, тупанул.
Однако, всяко лучше делать это через интерфейс:

package {

import flash.events.IEventDispatcher;

/**
* Интерфейс для основного класса загружаемой флешки
*
* @author gloomyBrain
*/
public interface IContent extends IEventDispatcher {

function biteMe():String;

}

}


Главный класс загружаемой флешки

public class Main extends Sprite implements IContent {

public function Main() {
...
}
}


Если же нам нужно о чем-то попросить главный модуль из загружаемого, мы можем сделать это через sharedEvents:

// в главном классе загружаемой флешки
super.loaderInfo.sharedEvents.dispatchEvent();


И загружающая флешка:

package {

import flash.display.Loader;
import flash.display.LoaderInfo;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.net.URLRequest;
import flash.system.LoaderContext;

/**
*
*
* @author gloomyBrain
*/
public class Main extends Sprite {

public function Main() {

if (super.stage) this.init();
else super.addEventListener(Event.ADDED_TO_STAGE, init);

}

private function init(event:Event = null):void {

super.removeEventListener(Event.ADDED_TO_STAGE, init);
super.stage.scaleMode = StageScaleMode.NO_SCALE;
super.stage.align = StageAlign.TOP_LEFT;

// entry point

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest("...");
var context:LoaderContext = new LoaderContext();

loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(request, context);

}

private function onComplete(event:Event):void {

var loaderInfo:LoaderInfo = event.currentTarget as LoaderInfo;
loaderInfo.removeEventListener(event.type, arguments.callee);

var content:IContent = loaderInfo.content as IContent;
if (!content) throw new IllegalOperationError("Загруженный контент не реализует IContent!");

// вот тут можем управлять загруженной флешкой из основной
content.biteMe();
// или подписаться на события
content.loaderInfo.haredEvents.addEventListener(someEvent, someListener);

}

private function someListener(event:someEvent):void {

(event.currentTarget as IContent).biteMe();

}

}

}

Интерфейс должен быть вкомпилен в обе флешки

L_Ghost
14.04.2011, 10:25
to _sestra_:
Вы описали обращение в функции родителя, это понятно, а если нужно обратиться к функциям произвольного объекта из основного клипа?

Добавлено через 3 минуты
to gloomyBrain:
сорри, но с Вашим кодом мне нужно разбираться. С ходу не пойму. Не тот у меня уровень работы с as3.

_sestra_
14.04.2011, 10:29
to _sestra_:
Вы описали обращение в функции родителя, это понятно, а если нужно обратиться к функциям произвольного объекта из основного клипа?

Сохраняйте ссылку на объект и обращайтесь к его методам
function onComplete (e:Event):void
{
// сохраняем ссылку
var object:DisplayObject = e.target.content as DisplayObject;
// обращаемся
object.doSomething();
}

L_Ghost
14.04.2011, 10:44
[QUOTE=_sestra_;989255]Сохраняйте ссылку на объект и обращайтесь к его методам
Это обращение в функциям объекта, а мне нужно из подгруженного объекта обратиться к функциям произвольных объектов в основном клипе (видимо по именам этих объектов).

elder_Nosferatu
14.04.2011, 12:03
Сохраняйте ссылку на объект и обращайтесь к его методам
Это обращение в функциям объекта, а мне нужно из подгруженного объекта обратиться к функциям произвольных объектов в основном клипе (видимо по именам этих объектов).

Вам же говорят: "Сохраняйте ссылку на объект...". По этой ссылке вы имеете доступ ко всем свойствам и методам объекта (дочерние объекты - тоже свойства родителя)! А вот как загруженный клип узнает имена дочерних объектов и их свойства/методы - это уже ваша забота