代码之家  ›  专栏  ›  技术社区  ›  Matt

AS3一个类中的键盘事件?

  •  2
  • Matt  · 技术社区  · 15 年前

    我似乎很难让一个类内的键盘事件工作,我有一个输入框事件,它工作正常,但键盘事件从未被调用。有什么想法吗?这是密码

    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");
            }
    
    }
    }
    

    事先谢谢!

    3 回复  |  直到 15 年前
        1
  •  16
  •   fenomas    15 年前

    与AS2不同,在AS3中,键盘事件不是全局的。它们被发布到舞台上,并通过显示列表冒泡到任何显示对象具有焦点的地方。在代码中,事件侦听器被添加到 mainGame 所以只有在 马丁梅 在舞台上,用户点击(或鼠标过多,我忘了)了 马丁梅 电影剪辑。

    如我所说,当你想在全球范围内获得键盘事件时,它们都从冒泡前的阶段开始,所以如果你在该阶段注册事件,你将获得所有键盘事件。正如凯科夫所说,这样做的方法是

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
    

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

    因此,为了省去解释,如果您在 马丁梅 已添加到该阶段。如果没有简单的方法,可以将键盘监听器添加到另一个知道何时触发的监听器中:

        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
  •  2
  •   Kekoa    15 年前

    将键盘事件监听器添加到舞台上,而不是添加到课堂上。

    stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
    
        3
  •  2
  •   wen    13 年前
     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++;     
                         }     
                }