AS 3 Вызов функции в родительском из дочернего мувиклипа - PullRequest
1 голос
/ 21 декабря 2011

У меня есть контейнер swf с именем main.swf, который загружает дочерние файлы swf в контейнер с помощью класса Loader.

В AS2 я мог вызывать функции контейнера main.swf, используя

_root.someFunction();

Является ли AS3 У меня возникла проблема, как это сделать.

Я попытался использовать:

MovieClip(root.parent.parent).someFunction();

(получить корень child.swf, родительский элемент является загрузчиком, родительский элемент основным.swf)

но это выглядит как null

Есть ли способ сделать это, чтобы он не выдавал ошибку в дочернем swf и работал при загрузке в основной swf?

Ответы [ 5 ]

4 голосов
/ 21 декабря 2011

Я не знаю, есть ли ваш код на временной шкале или в классе.Я думаю, что это в первом кадре временной шкалы.Если это так, в A.swf у вас может быть:

function someFunction():void{
    trace("called from B.swf");
}
//
var mLoader:Loader = new Loader();
var mRequest:URLRequest = new URLRequest("B.swf");
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
mLoader.load(mRequest);
//
function onCompleteHandler(loadEvent:Event):void
{
       container.addChild(loadEvent.currentTarget.content);
}

, а в вашем B.swf (загруженном A.swf в видеоклип с именем экземпляра «контейнер»):

btn.addEventListener(MouseEvent.MOUSE_DOWN,callA);
//
function callA(e:MouseEvent)
{
    if (this.parent.parent != null)
    {
        var p:MovieClip = this.parent.parent as MovieClip;
        p.someFunction();
    }
}

Не очень элегантно, но должно работать.Я бы использовал События, но вы попросили прямой вызов функций.

2 голосов
/ 22 сентября 2015

это работает!просто замените "_root" на "MovieClip (root)", как этот сценарий действия 2

_root.movieclip1.stop();

сценарий действия 3

MovieClip(root).movieclip1.stop();

"movieclip1" - это имя экземпляра

его работа!

2 голосов
/ 21 декабря 2011

Этого можно добиться, вызвав parent.parent.somefunction ();

Я приведу пример ниже

Родительский спрайт

public class Main1 extends Sprite
{
    public function Main1()
    {
        super();

        var loader:Loader = new Loader();
        addChild(loader);
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function():void{
            trace("I am parent ....  I am calling a child function");
            Object(loader.content).invoke();

        });
        loader.load(new URLRequest("Sample1.swf"));

    }

    public function invoke():void{
        trace("I am parent ....  Child invoked this function");
    }
}

Детский спрайт

public class Sample1 extends Sprite
{
    public function Sample1()
    {
        super();
    }


    public function invoke():void{
        trace("I am child ....  I am calling parent function");
        (Object(parent.parent)).invoke();   
    }


}

Запуск Main1 после компиляции Sample1 должен дать следующую трассировку

Я родитель .... Я вызываю дочернюю функцию

Я ребенок .... Я вызываю родительскую функцию

Я родитель .... Ребенок вызвал эту функцию

0 голосов
/ 05 ноября 2016

Если клип B находится внутри клипа A (или клип B находится внутри корня), и вы хотите вызвать «someFunction», которая находится в A / root из клипа B, эта точечная нотация сработала для меня:

MovieClip (this.parent) .someFunction ();

0 голосов
/ 29 марта 2013

У меня была такая же проблема, обновляя код AS2 до AS3.Но я использовал массив для вызова целого списка SWF-файлов для автоматической загрузки одного за другим без кнопки.

Я принял ваше решение этой проблемы и сформировал, чтобы соответствовать моим потребностям, и это сработало!Для тех, кто хочет мой код, вот он:

Контейнер (родительский) SWF, который вызывает загрузчик для загрузки массива SWF (на 1-м кадре временной шкалы):

import flash.net.URLRequest;
stop();

// Module Name and pages //

var mcArray:Array = new Array("swf/1-Intro.swf",
                        "swf/2-DOTdefinition.swf",
                        "swf/3-HazardousTable.swf",
                        "swf/4-BillsofLading.swf",
                        "swf/5-PaperBillsofLading.swf",
                        "swf/6-ReturnsManifest_v2.swf",
                        "swf/7-BillsOfLading.swf",
                        "swf/8-HazardClasses.swf",
                        "swf/9-HazardClasses2.swf",
                        "swf/11-ORMD.swf",
                        "swf/12-ID_Number.swf",
                        "swf/13-PackingGroup.swf",
                        "swf/14-ThinkAboutIt.swf",
                        "swf/15-EmergencyResponseBook.swf",
                        "swf/16-Labels.swf",
                        "swf/17-WhyKeepRecords_P1.swf",
                        "swf/17-WhyKeepRecords_P2.swf",
                        "swf/18-EmergencyResponseProcedures.swf",
                        "swf/19-SpillManagement.swf",
                        "swf/20-PreventativeMeasures.swf",
                        "swf/21-Security_v3.swf",
                        "swf/22-Certification.swf");

// Movie Clip Loader

var myMCL:Loader = new Loader();
var curFrameNum:Number = 0;

myMCL.addEventListener(Event.COMPLETE, loadNext);

function loadNext() { //this should be a global variable
var url:String = mcArray[curFrameNum];
var urlRequest:URLRequest = new URLRequest(url);
myMCL.load(urlRequest);
addChild(myMCL);
curFrameNum++;
}

loadNext();

Вызов родительского метода помещается в последний кадр каждого SWF-фильма (дочерний):

stop();
parent.parent.loadNext();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...