2013-02-05 83 views
0

注意:是的,我知道以前也有類似的問題。但是,在回答這些問題後,我仍然陷於困境,無法找到解決問題的辦法。從.as文件添加到ActionScript 3中的舞臺

我有一個問題,需要添加DisplayObject到Flash階段。因爲我要顯示的幾種不同類型的元素,我決定創建一個類的.as文件和addChild功能稱爲「電子屏」之間的中介工作,如下圖所示:

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.display.Stage; 

    public class Displayer extends Sprite //I read somewhere that DisplayObject 
//as an extension can't be used for this, so Sprite will have to do. 
    { 
     private var _stage:Stage; 

     function Displayer() 
     { 
      _stage = new Stage; 
     } 

     public function displayElement(displayable:DisplayObject) 
     { 
      _stage.addChild(displayable); 
     } 
    } 
} 

我編譯它,出現一個我不明白的問題:錯誤#2012:無法實例化Stage類。很明顯,這段代碼中的某些內容可能會丟失或者不合適,但是由於它非常直截了當,我沒有看到問題所在。我相信這不是很複雜,我可能只是需要一個局外人的視角。

回答

0

好吧,我認爲實例化一個stage類是不行的,因爲as3文檔中提到:「Stage對象不是全局可訪問的,您需要通過DisplayObject實例的stage屬性來訪問它。

您應該將對Stage對象的引用傳遞給您的Displayer類,並且您可以通過顯示對象實例獲得對stage對象的引用,如文檔所述。

所以構造函數現在可能類似於:

function Displayer(stage:Stage) 
{ 
    _stage = stage; 
} 

假設該實例的電子屏的對象是階段的孩子,你可以通過

displayer = new Displayer(stage); 

實例化電子屏如果您使用此的方法,沒有必要使用Displayer類來擴展任何內容或將其添加到舞臺上(這是bitmapdata.com方法中必須的)。

+0

沒有語法錯誤,同樣的實例將被創建,只有Stage類是像Singleton模式是不能被實例化。而不是問題的語法。 –

+0

感謝的BitmapData。我編輯我的答案。 – khailcs

4

舞臺對象不是全局可訪問的。您需要通過DisplayObject實例的stage屬性來訪問它。

參考以下文檔。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Stage.html

package 
{ 
    import flash.display.DisplayObject; 
    import flash.display.Sprite; 
    import flash.display.Stage; 

    public class Displayer extends Sprite 
    { 
     var isAddedToStage:Boolean; 

     public function Displayer() 
     { 
      if(stage) init(); 
      else  addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event=null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 
      isAddedToStage = true; 
     } 

     public function displayElement(displayable:DisplayObject):void 
     { 
      if(isAddedToStage) 
       this.stage.addChild(displayable); 
     } 
    } 
} 
+0

這當然似乎是一個有趣的解決方案,但爲了添加和刪除事件偵聽器,沒有我需要延長'EventDispatcher'?有沒有嘗試過,所以也許我錯了。 – Anthony

+0

你不需要擴展EventDispatcher。爲了上面的代碼解釋,其實是從'Flash'的概念階段和'閃存builder'。我們不略有不同在'閃光燈'中關注舞臺''原因基本上在屏幕上,舞臺總是自動閃光,因爲沒有問題。 但是,在'Flash builder'中必須調用First Stage,後來調用Main Class構造函數。但總是不採取這一步驟。通常建議始終使用上面的代碼。如果您遇到運行時錯誤,您將能夠理解我的評論。 –

1

你不實例化Stage類,如錯誤說。就像你不能實例化DisplayObject類(這就是爲什麼你必須擴展Sprite)。

基本上,你這裏有兩種選擇:

1)你從DisplayObjectContainer實例添加了孩子。

var displayerInstance:Displayer = new Displayer(); 
this.addChild(displayerInstance); 

您將從已添加到全局舞臺的DisplayObjectContainer對象運行此操作。每個項目只有一個階段,即使嵌入了SWF,SWF的階段屬性實際上也是頂級應用程序的階段屬性。因此,如果將此Displayer實例嵌套在嵌套在主應用程序中創建的另一個類中的類中,則必須在每個類中運行「addChild」才能顯示Displayer

2)你作弊。這是不推薦的,根本就是。基本上,當你實例化Displayer類時,你傳遞一個對象的舞臺對象。

var displayerInstance:Displayer = new Displayer(this.stage); 
public function Displayer(stage:Stage) { 
    this.stage = stage; 

    if (this.stage) { 
     this.stage.addChild(this); 
    } 
} 

這是一個很好的方法,可以將單例添加到舞臺上(除了沒有Singleton的構造函數)。我在聖誕節前創建了一個分析器,它是一個Singleton(後來發現了Scout,damnit),它在適當的時候使用這種方法將事物添加到舞臺上。

同樣,不推薦第二個選項針對這種情況,但它是一個可能性。

另外,你應該從來沒有添加東西直接Stage,除非有明確的理由這樣做(如彈出)。您應該遵循顯示列表方法,其中DisplayObjectContainer將另一個DisplayObject或DisplayObject容器作爲子項添加,等等,以便它們都連接到TopLevelApplication。

0

總有一個簡單的solutions.if你需要一個子元素添加到您的類級你可以通過舞臺到你的類作爲一個對象,並添加子元素進去,我這樣做是爲了增加像這樣進入我的舞臺。

package { 
    import flash.display.Loader; 
    import flash.display.Sprite; 
    import flash.net.URLRequest; 
    import flash.display.Bitmap; 

    public class ImageLoader extends Sprite{ 


     private var stageObj:Object; //create local variable to refarance stage 

     public function loadeimage(StageObject:Object, Url:String){ //StageObject will bring the stage refarance into the class 

      var reQuest:URLRequest = new URLRequest(Url); 
      loader.load(reQuest); 

      stageObj=StageObject; //make local refarance for stage inside the class 

      var image:Bitmap; 
      image=Bitmap(loader.content); 

      image.x = 100; 
      image.y = 100; 

      stageObj.addChild(image); // add whatever object into stage refarance and this means the real stage.. 

     } 
    } 

} 

只與評論的事情是重要的,你可以將該文件保存爲ImageLoader.as並導入它,使用它是這樣的。

import ImageLoader; 

var IL:ImageLoader = new ImageLoader(); 
IL.loadeimage(this,"img.jpg"); 

其簡單。我認爲這是你的搜索...祝你好運。 (你可以通過任何容器或容器parant這樣或this.stage也不要緊,你的孩子會成爲它的一部分。

相關問題