Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 闪存AS3键盘事件未触发_Actionscript 3_Flash_Events_Keylistener_Dismiss - Fatal编程技术网

Actionscript 3 闪存AS3键盘事件未触发

Actionscript 3 闪存AS3键盘事件未触发,actionscript-3,flash,events,keylistener,dismiss,Actionscript 3,Flash,Events,Keylistener,Dismiss,我有一门课是这样的: public class GameOverScreen extends MovieClip { public function GameOverScreen(useMouseControl:Boolean) { if(useMouseControl){ Mouse.show(); restartButton.addEventListener(MouseEvent.CLICK, onClickRestar

我有一门课是这样的:

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));
    }...
这是一个游戏的结束画面。(惊喜!)如果我按下空格键,或者点击屏幕上的重启按钮,我希望它能重启我的游戏。正如您所看到的,屏幕在构造函数中得到一个布尔值,它决定我们使用键盘或鼠标来控制游戏。它与鼠标配合得很好,但使用键时,我必须单击重新启动按钮(屏幕上的图标),直到它什么也不做,然后单击它,我按下一个按钮,我就可以看到游戏屏幕,但我的keylistener仍然在工作,如果我按下任何键,它就会重新启动游戏

我的主要课程的要点是:如果玩家死亡,他将获得一个游戏屏幕,游戏屏幕将被解除,游戏屏幕也将获得一个侦听器,它侦听一个称为重新启动的事件,如果事件被调度,将创建一个新的游戏屏幕,游戏将被解除

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();
    }
我希望这是可以理解的,如果没有请注意什么是不干净的。 谢谢

更新

我的onAddToStage函数

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

尝试将密钥侦听器添加到阶段:

stage.addEventListener(KeyboardEvent.KEY_DOWN, onPushSpace);
否则,您当前的类需要处于焦点位置,这就是为什么只有在单击它之后才能工作。当你的游戏在屏幕上完成时,一定要删除这个侦听器

或者,您可以在加载(在构造函数中)时通过代码将游戏置于屏幕上:

还有一个小提示——我注意到你没有在游戏结束后从显示列表中删除屏幕上的游戏。您将希望这样做以使它真正消失(并删除重启事件侦听器)


因此,重点仍然放在舞台上,舞台是回避者(主要职业),这就是为什么如果我放下游戏屏幕,听众仍然留在那里?没错,尽管从技术上讲,舞台是主要职业的父职业。你这样做是因为只要swf/应用程序有焦点,你就会得到你的关键事件。但是如果我写这个,它应该是指我写它的类,所以在我的例子中是游戏屏幕,不是吗?是的,但是为了让你的游戏屏幕发送键盘事件,它必须有焦点(或者它的一个孩子有)。您可以通过代码(我将更新答案以显示如何)来关注它,然后它可能在不将侦听器附加到舞台的情况下工作。当你第一次在屏幕上显示游戏时,焦点仍然是你上次点击的好主意,但是舞台指向空,但是我能弄清楚,如何将它传递到游戏屏幕上。我认为保持键盘在游戏屏幕上听东西是很重要的,我认为它属于那里,就像鼠标听东西也属于那里一样。一个建议(与你的问题无关),为什么不同时启用鼠标和键盘,而不是一个或另一个呢?似乎即使启用了空格键快捷方式,您也总是希望“重新启动”按钮具有“单击”处理程序。不幸的是,事实并非如此。我希望它只与鼠标一起工作,或者只与键盘一起工作,因为我希望它是这样的:d。说真的,这是我目前正在学习的教程的目标,所以我需要这样做。你有满意的解决方案吗?如果我的回答能引导你达到目的,请接受它。如果没有,请更新您的问题。
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;
}