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

标签 java event-dispatch-thread

我正在为 CS 类(class)编写游戏。

有一个 GUI MyDisplay,它是一个带有 JFrame 的扩展 KeyListener 和一个打包的 JPanel[][] 实例变量。

MyGame 有一个名为 GameState 的私有(private) enum,它是 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 调用名为 enterPressedMyGame 方法,相应地更改状态。

当我编译它时,游戏运行不正常。当我按下 enter 键(并打印出状态以进行检查)时,我注意到 MENU 应该变为 PLAY。但是即使状态在 PLAY 中,g.play() 也没有被评估(我测试了控制台是否在 play( )).

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

最佳答案

您正在点击 thread starvation案件。因为你的初始状态是 MENU 循环消耗了所有的 cpu,而 UI 没有机会消耗你的按键事件。 尝试小睡一会儿,例如:sleep(10)

Here您会发现更多信息和大量替代方案,甚至 Timer 对 CPU 更友好,但还有更好的方法,具体取决于您的游戏逻辑。

关于java - 为什么在 While(true) 循环中需要额外的一行代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13104015/

相关文章:

java - 让元素消失

java - 在 Jsoup 中解析 html

java - 在Jfreechart中更改图形的X轴起始值

java - 如何从 BroadcastReceiver 发出通知?

Java SwingUtilities.invokeLater 更新 TextArea

从 SQL 数据库加载时的 Java 进度条

java - 在没有main方法的情况下,paint方法如何运行?

java - 线程 "main"java.util.regex.PatternSyntaxException : Unmatched closing 中出现异常

java - 当温度更新时更新java中gui上的jlabel温度

java - 让 Swing 刷新 JLabel 时遇到问题(显然在事件调度线程上)