为什么在While(true)循环中需要额外的代码行?

时间:2012-10-27 20:41:49

标签: java event-dispatch-thread

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

有一个GUI MyDisplay,它是一个扩展KeyListener,其中JFrame的实例变量包含JPanel[][]

MyGame有一个名为enum的私人GameState,可以是MENUPLAYQUITPAUSEMyGame具有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 */
}

playpausemenu调用MyDisplay的各种调用来绘制新内容。状态可以改变的唯一方法是用户按下回车键。然后,MyDisplay调用名为MyGame的{​​{1}}方法,该方法会相应地更改状态。

当我编译它时,游戏表现不正常。当我按下回车键(并打印出要检查的状态)时,我会注意到,菜单会变为PLAY。但即使状态处于PLAY状态,enterPressed也未被评估(我测试了控制台是否在g.play()中添加了一行代码中打印出测试用语。)

但让我感到困惑的是,当我在play()的{​​{1}}循环中输入对System.out的任何号召时,例如System.out.print("");时,一切正常,{ {1}}会被调用。

1 个答案:

答案 0 :(得分:3)

您正在遇到thread starvation案件。因为您的初始状态是MENU,所以循环会占用所有cpu,并且UI没有机会消耗您的按键事件。 尽情享受小睡,例如:sleep(10)

Here你会发现更多的信息和很多替代方案,即使Timer对CPU更友好,但有更好的方法,取决于你的游戏逻辑。