我正在为CS课程编写游戏。
有一个GUI MyDisplay
,它是一个扩展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 */
}
play
,pause
和menu
调用MyDisplay
的各种调用来绘制新内容。状态可以改变的唯一方法是用户按下回车键。然后,MyDisplay
调用名为MyGame
的{{1}}方法,该方法会相应地更改状态。
当我编译它时,游戏表现不正常。当我按下回车键(并打印出要检查的状态)时,我会注意到,菜单会变为PLAY。但即使状态处于PLAY状态,enterPressed
也未被评估(我测试了控制台是否在g.play()
中添加了一行代码中打印出测试用语。)
但让我感到困惑的是,当我在play()
的{{1}}循环中输入对System.out
的任何号召时,例如System.out.print("");
时,一切正常,{ {1}}会被调用。
答案 0 :(得分:3)
您正在遇到thread starvation案件。因为您的初始状态是MENU
,所以循环会占用所有cpu,并且UI没有机会消耗您的按键事件。
尽情享受小睡,例如:sleep(10)
Here你会发现更多的信息和很多替代方案,即使Timer
对CPU更友好,但有更好的方法,取决于你的游戏逻辑。