-->

闪光AS3的KeyboardEvent不点火(Flash AS3 KeyboardEvent not

2019-09-21 13:33发布

我有这样一个类:

public class GameOverScreen extends MovieClip {
    public function GameOverScreen(useMouseControl:Boolean) {
        if(useMouseControl){
            Mouse.show();
            restartButton.addEventListener(MouseEvent.CLICK, onClickRestart);
        }
        else{
            this.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);
        }
    }

    public function onClickRestart(mouseEvent:MouseEvent):void{
        dispatchEvent(new NavigationEvent(NavigationEvent.RESTART));
    }

    public function onPushSpace(keyboardEvent:KeyboardEvent):void{
        trace(keyboardEvent);
        dispatchEvent(new NavigationEvent(NavigationEvent.RESTART));
    }...

这是一个游戏的结束画面。 (惊喜!)我想它重新启动我的比赛,如果我按下空格键,或点击restartButton在屏幕上。 正如你可以看到屏幕在构造函数中获取一个布尔值,至极决定我们使用键盘或鼠标来控制比赛。 它与鼠标工作得很好,但关键,我必须点击重启按钮 (至极是在屏幕上),直到它什么都不做,然后点击它之后,我按下一个按钮,我得到的播放屏幕,但我的KeyListener是somewhy还在工作,如果我按任意键,将重新启动游戏。

我的主类的观点是:如果玩家死亡,他获得了gameOverScreen和播放屏幕将被解雇,在gameOverScreen也得到监听器,它侦听称为RESTART事件,如果事件被分派,一个新的播放屏幕是创建的,而游戏结束驳回。

public class Avoider extends MovieClip { ....
     public function onAvatarDeath(avatarEvent:AvatarEvent):void {

        var finalScore:Number = playScreen.getFinalScore();
        var finalTime:Number = playScreen.getFinalTime();

        gameOverScreen = new GameOverScreen(useMouseControl);
        gameOverScreen.addEventListener(NavigationEvent.RESTART, onRequestRestart);
        gameOverScreen.setFinalScore(finalScore);
        gameOverScreen.setFinalTime(finalTime);
        addChild(gameOverScreen);

        playScreen = null;
    }

    public function restartGame():void {
        playScreen = new PlayScreen(useMouseControl);
        playScreen.addEventListener(AvatarEvent.DEAD, onAvatarDeath);
        addChild(playScreen);

        gameOverScreen = null;
    }

    public function onRequestRestart(navigationEvent:NavigationEvent):void {
        restartGame();
    }

我希望这是可以理解的,如果不是请注意它是什么不干净。 谢谢

UPDATE

我onAddToStage功能

public function onAddToStage(event: Event):void{
    stage.focus = this;
this.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);
    }

Answer 1:

试着增加你的按键侦听阶段:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);

否则,当前类需要成为市场关注焦点,这就是为什么只能当你点击它,直到。 要确保当你在游戏画面虽然为了去除听众。

另外,您可以通过代码给你的游戏结束画面焦点,当它加载(在构造函数中):

public function GameOverScreen(useMouseControl:Boolean) {
    this.addEventListener(Event.ADDED_TO_STAGE,addedToStage,false,0,true);

    if(useMouseControl){
        Mouse.show();
        restartButton.addEventListener(MouseEvent.CLICK, onClickRestart, false, 0, true);
    }
    else{
        this.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace, false, 0, true);
    }
}

private function addedToStage(e:Event):void {
    stage.focus = this;
    stage.stageFocusRect = false;  //make sure there's no dumb yellow rectangle
}

也有一些小技巧 - 我注意到你没有结束,从屏幕显示列表一旦它完成删除您的游戏。 你要做到这一点,使之真正走开(并删除重启事件侦听器)。

public function restartGame():void {
    playScreen = new PlayScreen(useMouseControl);
    playScreen.addEventListener(AvatarEvent.DEAD, onAvatarDeath);
    addChild(playScreen);

    gameOverScreen.removeEventListener(NavigationEvent.RESTART, onRequestRestart);
    removeChild(gameOverScreen);
    gameOverScreen = null;
}


文章来源: Flash AS3 KeyboardEvent not firing