2010-12-19 7 views
0

저는 액션 스크립트를 처음 접했고, 스네이크 게임을 만들려고합니다. 분명히 전역 키 수신기를 구현해야하지만 이상한 문제가 있습니다. 리스너를 응용 프로그램 태그에 추가하려고 시도했지만 효과가없는 것 같습니다 (영화는 여전히 컴파일 할 수있었습니다). 나는액션 스크립트 3에 키 리스너 추가하기

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

내 프로그램이 충돌을 호출 할 때마다. 또한

<?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> 

, 그것이 내가이 스택 트레이스 점점 오전 보인다 : 다음은 내 main.mxml 파일의 내용이다

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이 정확하면 creationComplete 처리기에서 addKeyEvent에 대한 호출을 제거해야합니다. 나는 언급하지 않았지만 함축되어있다. 더 명확하게 답변을 업데이트하겠습니다. –