2009-06-06 5 views
2

クラス内でキーボードイベントを処理するのに問題があるようですが、正しく動作するENTER_FRAMEイベントがありますが、キーボードイベントは呼び出されません。何か案は?コードはこちらクラス内のAS3キーボードイベントですか?

package 
{ 
import flash.display.MovieClip; 
import flash.display.Stage; 
import flash.events.*; 
public class mainGame extends MovieClip 
{ 
    var myPlayer:player = new player(); 
    function mainGame():void 
    { 
     trace("arg!"); 
     addChild(myPlayer); 
     addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     addEventListener(Event.ENTER_FRAME, update); 
    } 
    function keyDown(evt:KeyboardEvent):void 
     { 
          trace("This never happens"); 
      myPlayer.x++; 
     } 
     function update(evt:Event):void 
     { 
      trace("This happens fine"); 
     } 

} 
} 

ありがとうございました!

答えて

16

AS2と異なり、キーボードイベントはグローバルではありません。それらはステージに発行され、どの表示オブジェクトにフォーカスがあっても表示リストをバブルします。あなたのコードでは、イベントリスナーはmainGameに追加されているので、mainGameがステージ上にあるときにのみ起動し、ユーザはmainGameムービークリップをクリック(またはマウスオーバーしている、忘れています)しています。

私が言ったように、キーボードイベントをグローバルに取得したいときは、バブリングする前にステージから始めます。ステージにイベントを登録すると、すべてのキーボードイベントが発生します。 kekoavが言ったように、それを行う方法は

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 

しかし、あなたの問題は、コード内のstageがグローバル変数ではないということです。これはすべてのDisplayObjectに共通のプロパティですが、オブジェクトが表示リストに追加されるまではnullです。

説明を省略するために、mainGameがステージに追加された後に呼び出すと、上記のコードが機能します。

function mainGame():void {  
     //... 
     addEventListener(Event.ADDED_TO_STAGE, stageAddHandler); 
     //... 
    } 

    private function stageAddHandler(e:Event):void { 
     stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
     removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler); 
    } 
2

キーボードイベントリスナーをクラスではなくステージに追加します。

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 
+0

これは動作しませんが、私はそれを行う際にnullオブジェクトを参照することはできません。 – Matt

+0

あなたがステージに来るまでステージを参照することができないからです。フェノマにはその解決策があります。 –

+0

はい、ステージがまだ構築されていない場合は、その余分な作業を行う必要があります。 – Kekoa

2
import flash.events.Event; 
import flash.events.KeyboardEvent; 

場所enterFrameイベント内のキーボード・イベントが、その方法は、それが毎回更新されます:あなたはそれを行うための簡単な方法がない場合とき火に、あなたは知っている別のリスナー内でキーボードのリスナーを追加することができますフレームが更新されます。

  function update(evt:Event):void  
      {  
        trace("This happens fine"); 
        function keyDown(evt:KeyboardEvent):void  
        {  
         trace("This never happens");  
         myPlayer.x++;  
        }  
      } 
関連する問題