2014-06-16 86 views
1

我在幾篇文章和做題一直在尋找各地去上究竟是什麼,我跟我的項目經歷的把握,但還沒有找到答案。事件監聽器不工作的主要雪碧AS3

我創建作爲我的根這個特定的項目主精靈(我用的術語,因爲我現在明白了。如果我在錯誤請指正)。在那個精靈類中,我添加了一個MouseEvent偵聽器,以便我可以用鼠標以某種方式操作。問題是,主Sprite的行爲好像不能讀取我的鼠標事件,或者它沒有大小,因此無法註冊鼠標事件。這裏是我的課程和我已經完成的測試。

============ 
Main Class = 
============ 

package 
{ 
    import flash.display.Sprite; 
    import Fu; 

    [SWF(backgroundColor = "0xffffff", width = "550", height = "400")] 
    public class Main extends Fu 
    { 

     public function Main():void 
     { 
      super(); 
      addMouseListener(); 
     } 

    } 

} 


========== 
Fu Class = 
========== 

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 
    import flash.events.MouseEvent; 

    public class Fu extends Sprite 
    { 
     private var display_height:uint; 
    private var display_width:uint; 
    private var default_background_color:uint; 

     public function Fu(display_height:uint = 400, display_width:uint = 550, default_background_color:uint = 0x2e2e2e) 
     { 


      this.display_height = display_height; 
      this.display_width = display_width; 
      this.default_background_color = default_background_color; 

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

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

      graphics.beginFill(default_background_color, 1); 
      graphics.drawRect(0, 0, display_width, display_height); 
     } 


     public function addMouseListener():void { 
      trace("Added Mouse Listeners"); 
      addEventListener(MouseEvent.CLICK, onMouseEvent); 
        // Also tried MouseEvent.MOUSE_OVER, MouseEvent.ROLL_OVER 
        // with no results either. 
     } 


     private function onMouseEvent(e:Event):void { 
      trace("Mouse Event Fired."); 
     } 

    } 

} 

一切編譯確定,直到我嘗試激活的MouseEvent如點擊,在這種情況下,沒有什麼是輸出到控制檯上運行得很好。

================ 
Console Output = 
================ 

Added Mouse Listeners 
//Event messages should appear here... 

如果我再添加第二個精靈(S)與下面的代碼的主類...

=========================== 
Added to Main constructor = 
=========================== 

var s:Sprite = new Sprite(); 
s.name = "s"; 

s.graphics.beginFill(0x000000); 
s.graphics.drawRect(0, 0, 200, 200); 

addChild(s); 

,並點擊的I得到「鼠標觸發的事件。」在控制檯窗口中,但不是當我點擊s'200x200框外。

我也嘗試添加聽者階段(這是不是最好我想要的東西,因爲我想這些聽衆隻影響這個特定的SWF文件的主Sprite),並描繪出...

trace(e.target, " ", (e.target as DisplayObject).name); 

當s被點擊時,在控制檯和「[object Sprite] s」中未被sprite s覆蓋的區域顯示「[object Stage] null」。

一個明顯的解決方法是使用s作爲我的「舞臺」並稱它爲一天,但我很好奇爲什麼事件監聽器不能在主sprite上工作,並且爲什麼它沒有像其他sprites一樣的默認實例名稱做。

任何想法?

+0

嗯。代碼似乎很好。檢查你的'Main'是否將'mouseEnabled'設置爲true。如果它是假的,它會解釋顯示的行爲。 – Vesper

+0

是你在'init'中繪製的矩形嗎? –

+0

@Vesper我剛剛檢查並將mouseEnabled設置爲true。 – MrJman006

回答

-2

您的文檔類不能擴展符,因爲傅需要兩個參數,一個文檔類不能有一個。另外,除了Sprite或MovieClip之外,文檔類沒有任何意義,因爲在應用層次結構中不能有更高的對象。但是如果你必須擴展一個超類無法接受參數的自定義超類。相反,請創建一個獨立的init方法,您可以自行顯式調用以註冊您的事件並繪製您的內容。

文檔類是一種特殊情況。當用作應用程序中的主要條目(而不是外部加載的swf)時,它們被設置爲不直接接收交互式事件並且行爲與單例類似。它們也被設置爲應用程序的根,並且是唯一具有可直接在構造函數中使用的階段的DisplayObject。設計思路是它應該是你的應用程序的容器,而不是它的一部分。層次結構是階段 - >根(文檔類) - >您的應用程序元素。 例如,如果您要將Fu實例添加爲文檔類實例的子項,那麼它將正常接收mouseevent,並且文檔類在傳播時也會捕獲這些事件。

+2

錯誤,因爲'Fu'中的參數有默認值。 – Vesper

+0

我明白BotMaster正在掌握的概念。一個文檔類只應該關注在後臺發生的構造函數中設置時間線,並且包括Fu實例在內的任何其他代碼都應該是獨立的,並且在init方法中創建,就像我在Fu中做的一樣(在階段和時間軸之後已創建)。我的例子有效,但邏輯上應該設計BotMaster如何描述。這仍然不會影響鼠標事件偵聽器的問題,因爲我已經在普通的Hello World世界主類上嘗試了它。 – MrJman006

+0

@BotMaster錯誤。 Fu中的參數具有默認值!投下你的答案。 – helloflash