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

L_Ghost 13.04.2011 17:59

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

_sestra_ 13.04.2011 18:25

В основной:
Код AS3:

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');
}

Во внутренней:
Код AS3:

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.
это:
Код AS3:

e.target.content.parent = this;

заменить на это:
Код AS3:

e.target.content.setParent(this);

если уж на то дело пошло )

Котяра 13.04.2011 18:57

бред какой-то

_sestra_ 13.04.2011 18:59

Цитата:

Сообщение от Котяра (Сообщение 989110)
бред какой-то

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

gloomyBrain 13.04.2011 19:12

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

package  {
 
        import flash.events.IEventDispatcher;
 
        /**
        * Интерфейс для основного класса загружаемой флешки
        *
        * @author gloomyBrain
        */

        public interface IContent extends IEventDispatcher {
 
                function biteMe():String;
 
        }
 
}

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

public class Main extends Sprite implements IContent {
 
        public function Main() {
                ...
        }
}

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

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

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

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

Цитата:

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

Сохраняйте ссылку на объект и обращайтесь к его методам
Код AS3:

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]Сохраняйте ссылку на объект и обращайтесь к его методам
Это обращение в функциям объекта, а мне нужно из подгруженного объекта обратиться к функциям произвольных объектов в основном клипе (видимо по именам этих объектов).


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

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