[AS3] 動態將元件庫影片元件增加到舞台上
最近在軍中空閒時就複習一下AS3,在討論過程中,學長問了我一個flash問題,就是如何動態將元件庫影片增加到舞台的問題,本來的問題是將元件匯出給ActionScript使用,但沒有要把影片元件先拉到場景中,而是要用語法動態加入元件(譬如想增加多個的時候),如果是寫在同一個fla檔裡頭就很好解決,但因為學長很固執就是一定要寫在as檔裡(覺得這樣code比較漂亮),於是就難倒我了,try了好久卻找不出原因,怎麼可以這麼容易就被打敗,所以回家就花點時間解決這個問題。
1 2 3 4 | var _mc:Draggable=new Draggable(); this.addChild(_mc); this.addChild(_mc); this.addChild(_mc); |
而此元件的事件我是另外撰寫在Draggable.as設定它的拖曳事件
Draggable.as
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裡,如此就可以順利解決此問題。
修改完後的程式碼如下
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(); } } } |
相關文章:

近期迴響