2011-12-21 74 views
1

我有一個名爲main.swf的容器swf,它使用Loader類將子swf加載到容器中。AS 3父子電影剪輯中的調用函數

在AS2中,我可以使用

_root.someFunction(); 

是AS3我有一個問題,如何做到這一點調用的main.swf容器的功能。

我已經嘗試使用:

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

(獲得child.swf的根,父是裝載機,父母是main.swf中)

但這就要到了爲空

是有沒有辦法做到這一點,以便它不會在子SWF中引發錯誤,並在加載到主SWF時工作?

回答

4

我不知道你的代碼是在時間軸上還是在課堂上。我認爲這是在時間軸的第一幀。如果是這樣,在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中加載到其實例名稱爲 「容器」 的MovieClip):

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

不是很優雅,但它應該工作。我會使用事件,但你問直接函數調用。

+0

我對main.swf的代碼位於文檔類中,而children.swfs中的代碼在時間線的第一幀 – 2011-12-22 13:38:37

+0

@jamie holliday:但你現在解決了嗎? – AsTheWormTurns 2011-12-22 14:21:18

2

這可以通過調用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(); 
    } 


} 

編譯樣本1後運行MAIN1應該給下面的跟蹤

我親...我打電話子函數

我的孩子....我打電話父功能

我父母....兒童調用此函數

+0

謝謝,經過一些額外的玩耍後,我發現加載器的父母始終爲空。這是因爲在子swf試圖訪問它的父級(主swf)之前,加載程序尚未添加到顯示列表中 – 2011-12-21 17:35:39

0

我遇到了同樣的問題,將AS2代碼更新爲AS3。但我正在使用一個數組來調用一個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(); 
2

它的工作原理! 只是改變 「_root」 與 「影片剪輯(根)」 這樣 動作腳本2

_root.movieclip1.stop(); 

動作腳本3

MovieClip(root).movieclip1.stop(); 

「movieclip1」 是實例名

的工作!

0

如果剪輯B裏面夾A(或剪輯B是內根),和你想調用駐留在A /根從剪輯B「someFunction」,這點符號爲我工作:

影片剪輯(this.parent).someFunction();