Просмотр полной версии : Обращение в функциям основного клипа из подгруженного swf
Доброго времени суток!
Ситуация такая:
В основной ролик загружаю внешний 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);
если уж на то дело пошло )
_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();
}
}
}
Интерфейс должен быть вкомпилен в обе флешки
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();
}
[QUOTE=_sestra_;989255]Сохраняйте ссылку на объект и обращайтесь к его методам
Это обращение в функциям объекта, а мне нужно из подгруженного объекта обратиться к функциям произвольных объектов в основном клипе (видимо по именам этих объектов).
elder_Nosferatu
14.04.2011, 12:03
Сохраняйте ссылку на объект и обращайтесь к его методам
Это обращение в функциям объекта, а мне нужно из подгруженного объекта обратиться к функциям произвольных объектов в основном клипе (видимо по именам этих объектов).
Вам же говорят: "Сохраняйте ссылку на объект...". По этой ссылке вы имеете доступ ко всем свойствам и методам объекта (дочерние объекты - тоже свойства родителя)! А вот как загруженный клип узнает имена дочерних объектов и их свойства/методы - это уже ваша забота
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.