首页 > 解决方案 > Java Swing - GameLoop - 奇怪的结果

问题描述

我是一名计算机科学专业的学生,​​试图学习游戏开发的基础知识。我以前使用过 .NET Winforms 等 GUI 框架,所以我对 GUI 开发并不完全陌生,但现在我正在尝试进入 Game Dev,据我了解,这是游戏的重要组成部分dev 是游戏循环。

到目前为止我理解它的方式,游戏循环的工作方式如下:(伪代码)

while (gameNotOver):
    modelData = getModelData;
    render(modelData);

理想情况下,这个循环会以每帧(FPS)的速度一遍又一遍地执行和迭代。

现在,在我进入 Unity 或其他任何东西之前,我试图在 Java Swing 中做到这一点,所以我有一些基础知识。这是我的一些代码:

应用类:

public static void Start(){
    GameLoop();
}

private static void GameLoop(){
    System.out.println("GameLoop()");
    System.out.println("---------------------------");
    JFrame frame = new JFrame();
    frame.setSize(300, 400);
    GUI gui = new GUI();
    frame.add(gui);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    int count = 0;
    while (count < 10){
        System.out.println("T-" + count + "-iteration");
        int modelInfo = Engine.update();
        gui.repaint();
        count++;
        System.out.println("---------------------------");
    }
}

图形界面类:

public class GUI extends JPanel{

    public GUI(){

    }

    @Override
    public void paint(Graphics g){
        System.out.println("GUI-paint()");
    }
    }

main 方法在它自己的类中,其中只有一行:Application.Start();

并不是代码不起作用,而是这让我很烦:

控制台输出结果

如您所见,paint()仅在最后被调用,而其他一切都在游戏循环中完美地下降。

现在我知道它在创建paint()时会被调用一次JPanel,但首先,这是否意味着 generate 中的 print 语句将位于顶部?

为什么游戏循环在调用之前先完成 10 次迭代paint()

理想情况下,我每次都尝试在游戏循环中调用重绘(游戏循环的渲染部分)

任何帮助是极大的赞赏

谢谢!!

标签: javaswing

解决方案


伪游戏循环看起来更像这样:

while (game not over)
    update model
    render graphics
    sleep

此循环不会发生在构造和执行 Swing 组件的同一代码中。构造和执行 Swing 组件的线程称为Event Dispatch Thread

伪游戏循环必须发生在单独的线程或 Swing 计时器中。当我说渲染图形时,我的意思是使用存储在游戏模型中的信息在绘图面板 (JPanel) 上绘图。

创建绘图面板时,您将覆盖 JPanel 类的 paintComponent 方法。方法的第一条语句必须是调用 super.paintComponent 以维护 Swing 绘制链。

这个 Stack Overflow 问题“如何组织游戏代码以适应 MVC 模式? ”的答案应该对您有所帮助。


推荐阅读