[Flash AS3] 載入與按鈕 (2)

既然是有外部載入的,但有些問題可以討論的

A.swf載入B.swf

應該A.swf跟B.swf的畫格數不同
但我有在B.swf做按鈕,按下後將A.swf的畫格切換到指定畫格
載入其他的swf使用

由剛剛的方式就可以看到,MainTimeline能有多個但stage只有一個

OK.  這裡告訴你如何從A.swf設定事件在B.swf的按鈕上

先寫載入B.swf到myb_mc的語法

var loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_CompleteHandler);
loader.load(new URLRequest(“B.swf”));
myb_mc.addChild(loader);
loader.x = 0;
loader.y = 0;

這裡不同的是,多了一行語法,意思是偵聽事件,當載入完成後執行loader_CompleteHandler函數
在loader_CompleteHandler函數可以這麼寫

function loader_CompleteHandler(e:Event):void
{
   loader.getChildAt(0).btn01.addEventListener(MouseEvent.CLICK,btn01_clickHandler);
}

function btn01_clickHandler(e:MouseEvent):void
{
   /*一些程式碼*/
}

幫在B.swf的btn01按鈕掛上偵聽事件

————————————————————–

方式不同,但做法相同的另一個寫法
陣列寫法,事先定義好按鈕陣列
程式寫的時候一併附掛偵聽事件,再由引發事件主人的名字還判斷要做甚麼事

 

function loader_CompleteHandler(e:Event):void
{
 var buttonsArr:Array = [loader.getChildAt(0).btn01, loader.getChildAt(0).btn02];

 for (var i:int = 0; i< buttonsArr.length; i++)
 {
  buttonsArr[i].addEventListener(MouseEvent.CLICK,clickHandler);
 }
}

function clickHandler(e:MouseEvent):void
{
   switch (evt.target.name)
   {
     case “btn01” :
          /*一些程式碼*/
          break;
      case “btn02” :
          /*一些程式碼*/
          break;
    }
}

 

[Flash AS3] 載入與按鈕 (1)

完全沒碰過Flash的語法
或者以下我的文章大家如果看不懂

強烈建議手邊要有書!!!

因為AS3語法不會太簡單,我對這語法還不熟
這理做筆記用以免馬上忘記

這是普通載入一個swf或是圖檔的寫法

var loader = new Loader();   //設定loader為載入影片的物件
loader.load(new URLRequest(“home.swf”)); //設定載入來源名稱
addChild(loader);    //載入至舞台(stage)上
loader.x = 0;  //設定載入後的X位置
loader.y = 0;  //設定載入後的Y位置

 語法中addChild的前面如果沒寫字,就是載入到舞台上
而有寫名字就會載入到指定名稱的MovieClip上

例如

myMovieClip.addChild(loader);

=======================================================

先說說Flash的階層概念

在Flash中,大部分的東西都是物件(DisplayObject),只是有名字跟沒名字而已(可做程式化控制)
載有載入外部檔案的時候,MainTimeline可以有多個,而stage只有一個

根目錄是[object Stage]

假設空白舞台上有個MovieClip叫做show_me

[object Stage]>[object MainTimeline]>show_me [object  MovieClip]

———————————–

如何切換其路徑?

假設要切換到[object MainTimeline]
可以這樣測試

trace(stage.numChildren); 
trace(stage.getChildAt(0)); 

Output視窗就會顯示1[object MainTimeline]
意指stage下只有一個子物件,而該第0號物件為MainTimeline (主時間軸)

相關指令:
numChildren():int                      是該物件底下有多少子物件
getChildAt(index:int)                  抓取第n個子物件
getChildByName(name:String)   抓指定名稱的子物件

———————————–

剛剛有提到
例如載A.swf載入B.swf的時候,MainTimeline會有多個,而stage只有一個
B.swf獨立執行時,有它自己的stage

而被A.swf所載入時,MainTimeline的父物件會被換成loader

如何知道的?

有個指令叫parent抓取其父物件

if (getChildAt(0).parent.parent == this.stage)
{
   trace(“並未由外部載入”);
}
else
{
   trace(“由外部載入”);
   trace(getChildAt(0).parent.parent);
}

這是判斷swf是否從外部載入,可判斷該swf執行時有沒有看到stage
外部載入這行就會顯示該loader物件為誰