2013-02-27 69 views
0

我是新來接力配合AS3編程, 我試圖創建一個監聽器當按下鍵將響應..AS3 Key Down事件偵聽器不起作用?

它工作得很好,當我鍵入它的時間表,但現在當它是在它自己的軟件包上它根本沒有反應,我做錯了什麼?

package{ 
    import flash.events.KeyboardEvent; 
    import flash.display.Sprite; 

    public class PlayerController extends Sprite{ 
     public function PlayerController(){ 
      addEventListener(KeyboardEvent.KEY_DOWN,onButDown); 
     } 
     function onButDown(event:KeyboardEvent):void{ 
      trace("Key Down"); 
     } 
    } 

} 

,並在主類我有這樣的:

var pc:PlayerController = new PlayerController(); 

感謝

回答

1

這裏的問題可能是PlayerController的實例沒有收到焦點(並且永遠不會,因爲它看起來不像將它添加到顯示列表中)。如果對象沒有焦點,則無法接收鍵盤事件。

一個解決辦法是在構造函數傳遞給stage的引用,然後將事件偵聽器添加到代替:

package 
{ 
    import flash.events.KeyboardEvent; 
    import flash.display.Sprite; 

    public class PlayerController extends Sprite{ 
     public function PlayerController($stageRef:Stage){ 
      $stageRef.addEventListener(KeyboardEvent.KEY_DOWN,onButDown); 
     } 
     function onButDown(event:KeyboardEvent):void{ 
      trace("Key Down"); 
     } 
    } 

} 

然後,在你的主應用程序:

var pc:PlayerController = new PlayerController(stage); 

編輯補充:假設stage不是null。在以這種方式實例化PlayerController之前,您需要確保這一點。

+0

謝謝,它似乎工作就像我想要:),順便說一句,我寫了這個對嗎? :public function PlayerController(stage:Stage) – Radicate 2013-02-27 21:01:49

+0

這將起作用,但Sprite已經有了一個公共屬性'stage',所以對於構造函數的範圍來說,你將覆蓋它。 – Marcela 2013-02-27 21:13:08

0

一般來說,你應該把所有事件偵聽器,他們要求在主類的功能。就這些。

+0

我只是試圖把它放在主類中,它只是不會工作..你在當前的代碼中看到任何錯誤嗎? – Radicate 2013-02-27 20:55:46