2010-12-19 15 views
0

私はアクションスクリプトには比較的新しいので、私はスネークのゲームを作ろうとしています。明らかにグローバルキーリスナーを実装する必要がありますが、私は奇妙な問題を抱えています。リスナーをアプリケーションタグに追加しようとしましたが、何の効果もないようです(ムービーはまだコンパイルできました)。私はアクションスクリプト3にキーリスナーを追加する

this.stage.addEventListener(KeyboardEvent.KEY_DOWN, key, true);

私のプログラムがクラッシュを呼び出すたびに。以下は私のmain.mxmlファイルの内容です:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application 
xmlns:mx="http://www.adobe.com/2006/mxml" 
layout="absolute" 
width="800" 
height="600" 
frameRate="15" 
creationComplete="creationComplete();" 
enterFrame="enterFrame(event);" 
currentState="MainMenu"> 

<mx:states> 
    <mx:State 
    name="Game" 
    enterState="enterGame(event)" 
     exitState="exitGame(event)"> 
    </mx:State> 
    <mx:State 
    name="LevelEnd"> 
    <mx:AddChild relativeTo="{myCanvas}" position="lastChild"> 
    <mx:Button x="380" y="344" label="Continue" id="btnContinue" click="btnContinueClicked(event)" width="90" height="30"/> 
    </mx:AddChild> 
    <mx:AddChild relativeTo="{myCanvas}" position="lastChild"> 
    <mx:Label x="10" y="10" text="Congratulations, you finished the level."/> 
    </mx:AddChild> 
    </mx:State> 
    <mx:State name="MainMenu"> 
    <mx:AddChild relativeTo="{myCanvas}" position="lastChild"> 
    <mx:Button x="381" y="344" label="Start" id="btnStart" click="startGameClicked(event)" width="90" height="30"/> 
    </mx:AddChild> 
    <mx:AddChild relativeTo="{myCanvas}" position="lastChild"> 
    <mx:Image x="10" y="49" source="@Embed('../media/mainmenu.png')"/> 
    </mx:AddChild> 
    <mx:AddChild relativeTo="{myCanvas}" position="lastChild"> 
    <mx:Label x="10" y="10" text="Snake Pro" fontSize="20" fontWeight="bold"/> 
    </mx:AddChild> 
    </mx:State> 
</mx:states> 

<mx:Canvas x="0" y="0" width="100%" height="100%" id="myCanvas"/> 

<mx:Script> 
<![CDATA[ 

    protected var inGame:Boolean = false; 
    protected var currentLevel:int = 1; 
    import flash.events.KeyboardEvent; 

    public function creationComplete():void 
    { 
    LevelDefinitions.Instance.startup(); 
    addKeyEvent(); 
    //stage.focus = stage; 
    } 

    private function addKeyEvent():void 
    { 
    this.stage.addEventListener(KeyboardEvent.KEY_DOWN, key, true); 
    } 

    public function enterFrame(event:Event):void 
    { 
     if (inGame) 
     { 
     GameObjectManager.Instance.enterFrame(); 

     myCanvas.graphics.clear(); 
     myCanvas.graphics.beginBitmapFill(GameObjectManager.Instance.backBuffer, null, false, false); 
     myCanvas.graphics.drawRect(0, 0, this.width, this.height); 
     myCanvas.graphics.endFill(); 
     } 
    } 

     private function key(event:KeyboardEvent):void { 
      //t1.text = event.keyCode + "/" + event.charCode; 

    GameObjectManager.Instance.setDirection(0, 1); 
    currentState = "MainMenu"; 
    inGame = false; 
     } 

    protected function startGameClicked(event:Event):void 
    { 
    currentState = "Game" 
    }  

    protected function enterGame(event:Event):void 
    { 
    Mouse.hide(); 
    GameObjectManager.Instance.startup(); 
    Level.Instance.startup(currentLevel); 
    inGame = true; 
    } 

    protected function exitGame(event:Event):void 
    { 
    Mouse.show(); 
    Level.Instance.shutdown(); 
    GameObjectManager.Instance.shutdown(); 
    inGame = false; 
    } 

    protected function btnContinueClicked(event:Event):void 
    { 
    currentLevel = LevelDefinitions.Instance.getNextLevelID(currentLevel); 
    if (currentLevel == 0) 
    { 
    currentLevel = 1; 
    currentState = "MainMenu"; 
    } 
    else 
    { 
    currentState = "Game" 
    } 
    } 
]]> 
    </mx:Script> 

</mx:Application> 

また、私がこのスタックトレースを取得していますようだ:

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at main/addKeyEvent()[C:\Users\Me\Desktop\Flash\Snake\src\main.mxml:58] 
    at main/creationComplete()[C:\Users\Me\Desktop\Flash\Snake\src\main.mxml:52] 
    at main/___main_Application1_creationComplete()[C:\Users\Me\Desktop\Flash\Snake\src\main.mxml:10] 
    at flash.events::EventDispatcher/dispatchEventFunction() 
    at flash.events::EventDispatcher/dispatchEvent() 
    at mx.core::UIComponent/dispatchEvent()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:12528] 
    at mx.core::UIComponent/set initialized()[E:\dev\4.x\frameworks\projects\framework\src\mx\core\UIComponent.as:1627] 
    at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:759] 
    at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1072] 

私はここに私のウィットの終わりだ、と私はあなたの時間を感謝し、尽力。ありがとう!

答えて

1

イベントリスナーを「ステージ」プロパティにアタッチするため、実行時にnullになります。 "creationComplete"イベントでこれを行う代わりに、 "applicationComplete"イベントでこれを実行してみてください。ステージオブジェクトが利用可能になります。

+0

ああ、私は今働いている。どうもありがとう! – kiryu1101

0

このゲームを実装するには、グローバルキーリスナーを実装する必要があることは明らかです。 Flexアプリケーションのコンテキストから、ステージではなくリスナーをアプリケーションタグに追加するのは理にかなっていませんか?

完全なスタックトレースとは何ですか?どのラインでエラーが表示されますか?ほとんどの場合、まだ初期化されていないオブジェクトにアクセスしないように条件を追加するだけです。

+0

完全なスタックトレースを表示するために投稿を編集しました。リスナーをアプリケーションタグに追加しようとしましたが、何の効果もないようです。 – kiryu1101

1

あなたのアプリケーションはまだステージに追加されていない可能性があります。そのため、addKeyEventに例外がスローされます。暗示されているように、あなたはまた、削除する必要が

<mx:Application 
    xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="absolute" 
    width="800" 
    height="600" 
    frameRate="15" 
    creationComplete="creationComplete();" 
    enterFrame="enterFrame(event);" 
    currentState="MainMenu" 
    keyDown="key(event)"> 

:それはあなたが本当にあなたがそうのように、代わりにアプリケーションに追加することができ、この場合には、ステージにイベントリスナーを追加する必要はありませんが、言われていますあなたのcreationCompleteハンドラでaddKeyEventを呼び出す必要があります。それ以外の場合は例外が発生します。

+0

keyDown属性を追加しても役に立ちませんでした。何かが欠けているか、映画に論理エラーがあるようです。キーイベントに入れることができるメッセージ(Javascriptのalert()関数に似ています)をトリガーするメソッドはありますか? – kiryu1101

+0

keyDownイベントをメインのApplicationタグに追加する場合は、コードを削除してイベントリスナーを手動で追加する必要があります。 – JeffryHouser

+0

@ www.Flextras.comが正しい場合は、createCompleteハンドラでaddKeyEventの呼び出しを削除する必要があります。私はそれについて言及しなかったが、それは暗に示されている。答えをもっと明示的に更新します。 –

関連する問題