首頁 > Actionscript, 程式設計 > [AS3] 動態將元件庫影片元件增加到舞台上

[AS3] 動態將元件庫影片元件增加到舞台上

2010年5月2日/文章瀏覽次數:287 次

最近在軍中空閒時就複習一下AS3,在討論過程中,學長問了我一個flash問題,就是如何動態將元件庫影片增加到舞台的問題,本來的問題是將元件匯出給ActionScript使用,但沒有要把影片元件先拉到場景中,而是要用語法動態加入元件(譬如想增加多個的時候),如果是寫在同一個fla檔裡頭就很好解決,但因為學長很固執就是一定要寫在as檔裡(覺得這樣code比較漂亮),於是就難倒我了,try了好久卻找不出原因,怎麼可以這麼容易就被打敗,所以回家就花點時間解決這個問題。

?View Code ACTIONSCRIPT
1
2
3
4
 var _mc:Draggable=new Draggable();
this.addChild(_mc);
this.addChild(_mc);
this.addChild(_mc);

而此元件的事件我是另外撰寫在Draggable.as設定它的拖曳事件

Draggable.as

?View Code ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 package {
	import flash.display.MovieClip;
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;
 
	public class Draggable extends MovieClip {
		function Draggable():void {
			this.addEventListener(MouseEvent.MOUSE_DOWN, mPress);
			stage.addEventListener(MouseEvent.MOUSE_UP, mRelease);
		}
		public function mPress(e:MouseEvent):void {
			var p:DisplayObjectContainer = this.parent;
			//p.removeChild(this);
			p.addChild(this);
			this.startDrag();
		}
		public function mRelease(e:MouseEvent):void {
			this.stopDrag();
		}
	}
}

連結部分也有設定好
類別:Draggable
基底類別:flash.display.MovieClip
會出給ActionScript共用跟匯出在第一個影格也有打勾
但執行時產生錯誤訊息

TypeError: Error #1009: 無法存取 Null 物件參考的屬性或方法。
at Draggable()
at 11_fla::MainTimeline/frame1()

在詢問了板上的神人與Google大神後,大致上了解是什麼原因,原因在於stage屬性一開始為null,當可視物件被加入至場景上後 stage屬性才會有值,所以在建構函式時就偵聽stage的話,就會發生”無法取存null的屬性或方法”,所以這邊要使用到Event.ADDED_TO_STAGE事件。

Help解釋為:加入至舞台上顯示清單的 DisplayObject 實體,方式為直接加入或透過加入包含 DisplayObject 實體的子樹狀結構來加入。 如果直接加入 DisplayObject 實體,便會在此事件之前發生 added 事件。

但由於我不是直接加入DisplayObject(也就是手動從元件庫抓取影片片段放到舞台上),而是由外部檔案加入DisplayObject(用程式動態載入),所以必須要手動加入ADDED_TO_STAGE事件,方法是寫在constructor裡,而其他DisplayObject的method或variables的宣告則放到該listener裡,如此就可以順利解決此問題。

修改完後的程式碼如下

?View Code ACTIONSCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 package {
	import flash.display.MovieClip;
	import flash.display.DisplayObjectContainer;
	import flash.events.MouseEvent;
	import flash.events.*;
 
	public class Draggable extends MovieClip {
		function Draggable():void {
			//trace(stage);
			this.addEventListener(Event.ADDED_TO_STAGE , addToStageHandler);
			//偵聽Event.ADDED_TO_STAGE事件,
   			//該事件指的是,當自已被加入場景上時,會觸法該事件
   			//因為被加入到場景上, 所以之後的stage屬性就不會是null
		}
 
		public function addToStageHandler(e:Event):void {
  		 	//這兒就可以設定要載入物件的變數和方法
			trace(stage.stageWidth);
			trace(stage.stageHeight);
   			this.addEventListener(MouseEvent.MOUSE_DOWN, mPress);
			stage.addEventListener(MouseEvent.MOUSE_UP, mRelease);
 		 }
 
		public function mPress(e:MouseEvent):void
		{
			var p:DisplayObjectContainer = this.parent;
			//p.removeChild(this);
			p.addChild(this);
			this.startDrag();
		}
		public function mRelease(e:MouseEvent):void {
			this.stopDrag();
		}
	}
}

相關文章:

cloudfly Actionscript, 程式設計

  1. 目前沒有任何的評論
  1. 目前還沒有任何 trackbacks 和 pingbacks。