我正在为 CS 类(class)编写游戏。
有一个 GUI MyDisplay
,它是一个带有 JFrame
的扩展 KeyListener
和一个打包的 JPanel[][]
实例变量。
MyGame
有一个名为 GameState
的私有(private) enum
,它是 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
调用名为 enterPressed
的 MyGame
方法,相应地更改状态。
当我编译它时,游戏运行不正常。当我按下 enter 键(并打印出状态以进行检查)时,我注意到 MENU 应该变为 PLAY。但是即使状态在 PLAY 中,g.play()
也没有被评估(我测试了控制台是否在 play( )
).
但真正让我感到困惑的是,当我输入任何对 System.out
的调用时,例如 System.out.print("");
在
循环,一切正常,并且 main
的 whileg.play()
被正常调用。
最佳答案
您正在点击 thread starvation案件。因为你的初始状态是 MENU
循环消耗了所有的 cpu,而 UI 没有机会消耗你的按键事件。
尝试小睡一会儿,例如:sleep(10)
Here您会发现更多信息和大量替代方案,甚至 Timer
对 CPU 更友好,但还有更好的方法,具体取决于您的游戏逻辑。
关于java - 为什么在 While(true) 循环中需要额外的一行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13104015/