0

私はこのようなクラスを持っています:

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をクリックすると、ゲームを再開したいのですが。画面がコンストラクターでブール値を取得していることがわかるように、ゲームの制御にキーボードまたはマウスを使用していると判断します。マウスではうまく機能しますが、キーを使用すると、何も起こらないまで再起動ボタン(画面上にあります)をクリックする必要があります。クリックしてボタンを押すと、playScreenが表示されますが、キーリスナーが表示されます。なぜかまだ動作中です。いずれかのキーを押すと、ゲームが再開されます。

私のメインクラスのポイントは、プレイヤーが死亡した場合、彼はgameOverScreenを取得し、プレイスクリーンが閉じられ、gameOverScreenもリスナーを取得し、RESTARTと呼ばれるイベントをリッスンし、イベントがディスパッチされた場合、新しいplayScreenは作成され、ゲームオーバーは却下されました。

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

1 に答える 1

2

キーリスナーをステージに追加してみてください。

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;
}
于 2012-08-23T17:28:06.337 に答える