2009-06-06 76 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不同,在AS3键盘事件不是全局的。它们被发布到舞台上,并且它们通过显示列表跳到显示对象所关注的任何位置。在你的代码中,你的事件监听器被添加到mainGame,所以只有当mainGame在舞台上时,才会触发,并且用户点击了(或者鼠标悬停,我忘记了)mainGame影片剪辑。如果我们想要全局获取键盘事件,它们都是在冒泡之前的阶段开始的,所以如果您在舞台上注册事件,您将获得所有的键盘事件。因此,作为kekoav说,做到这一点的方法是

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); 

然而,你的问题是,stage在代码不是一个全局变量。它是所有DisplayObject都通用的属性,但在将对象添加到显示列表之前它是空的。

因此,为了免去上述解释,上述代码将在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

不起作用,它告诉我,当我这样做时它不能引用空对象。 – Matt 2009-06-06 16:06:23

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++;  
        }  
      }