繁体   English   中英

一个类中的AS3键盘事件?

[英]AS3 keyboard events within a class?

我似乎无法在类中使键盘事件工作,我有一个工作正常的ENTER_FRAME事件,但键盘事件永远不会被调用。 有任何想法吗? 这是代码

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

}
}

提前致谢!

与AS2不同,在AS3中键盘事件不是全局的。 它们被发布到舞台上,并且它们通过显示列表鼓泡到任何显示对象具有焦点。 在你的代码中,你的事件监听器被添加到mainGame ,因此只有当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);
    }
 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++;     
                     }     
            }  

将键盘事件侦听器添加到舞台而不是类。

stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM