1

我正在为 CS 课程编写游戏。

有一个 GUIMyDisplay是扩展KeyListener的,带有一个为实例变量JFrame打包的。JPanel[][]

MyGame有一个私有enum调用GameState,它是MENU, PLAY, QUIT, 或PAUSE. MyGame具有static 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 */
}

Where play, pause, 和menu调用各种调用MyDisplay来绘制新的东西。状态可以改变的唯一方法是用户按下回车键。然后,MyDisplay调用一个相应地更改状态的MyGame方法。enterPressed

当我编译这个时,游戏的行为不正常。当我按下回车键(并打印出要检查的状态)时,我注意到,应该是,MENU 更改为 PLAY。但是即使状态处于 PLAY 状态,g.play()也不会被评估(我测试了控制台是否在添加的代码行中打印出测试短语play())。

但真正让我感到困惑的是,当我输入对 的任何调用时System.out,例如System.out.print("");在 的while循环中main,一切正常,并按g.play()应有的方式被调用。

4

1 回答 1

3

您遇到了线程饥饿的情况。因为您的初始状态是MENU循环消耗所有 cpu,并且 UI 没有机会消耗您的按键事件。试着在你的时间里睡一小会,比如:sleep(10)

在这里您会找到更多信息和许多替代方案,甚至 aTimer对 CPU 更友好,但有更好的方法,取决于您的游戏逻辑。

于 2012-10-27T20:51:11.690 回答