1

CSクラス向けのゲームを書いています。

インスタンス変数用にパックされMyDisplayた拡張されKeyListenerたGUI があります。JFrameJPanel[][]

MyGameには、 、、、またはのいずれかのプライベートenumコールがあります。 次の構造を持つメソッドがあります。GameStateMENUPLAYQUITPAUSEMyGamestatic void main

MyGame以下のとおりであります:

public class MyGame
{
    /* Private instance fields and constructor left out.  
    Constructor initializes a MyDisplay and state = MENU */

    public static void main(String[] args)
    {
        MyGame g = new MyGame();
        while(true)
        {
            gstate = g.getState();
            if(gstate == GameState.PLAY)
                g.play();
            else if(gstate == GameState.PAUSE)
                g.pause();
            else if(gstate == GameState.MENU)
                g.menu();
        }
    }

    /* implementation of MyGame methods */
}

playpause、および のmenuさまざまな呼び出しを呼び出して、MyDisplay新しいものを描画します。状態を変更できる唯一の方法は、ユーザーが Enter キーを押した場合です。次に、それに応じて状態を変更するメソッドをMyDisplay呼び出します。MyGameenterPressed

これをコンパイルすると、ゲームが正常に動作しません。Enter キーを押すと (状態を印刷して確認すると)、当然のことながら、MENU が PLAY に変わることに気付きます。しかし、状態が PLAY であっても、g.play()は評価されていません (コンソールが に追加されたコード行でテスト フレーズを出力するかどうかをテストしましたplay())。

しかし、本当に混乱しているのは、 のループSystem.outなどでへの呼び出しを入力すると、すべてが正常に機能し、必要に応じて呼び出されることです。System.out.print("");whilemaing.play()

4

1 に答える 1

3

スレッド不足のケースに遭遇しています。初期状態はMENUループがすべての CPU を消費するため、UI にはキー プレス イベントを消費する機会がありません。次のように、少し睡眠をとってみてください。sleep(10)

ここでは、より多くの情報と多くの代替手段を見つけることができます。さらに、TimerCPU にはるかに優しいものもありますが、ゲーム ロジックによっては、より良い方法があります。

于 2012-10-27T20:51:11.690 に答える