java - JFrame 中的游戏逻辑

标签 java swing jframe game-engine

我正在尝试根据用户输入编写具有不同状态的战舰游戏。我正在为不同类型的游戏类型、说明面板和它将具有的其他功能实现状态设计模式。我的问题是,当我为游戏制作 JFrame 时,应该在构建期间调用逻辑,还是应该在窗口更新期间调用逻辑?

例如:

public class BattleshipGui extends JFrame
{
  public BattleshipGui()
  {
    initizalizeFrame();
    executeLogic();
  }
}

执行逻辑包含根据游戏事件而变化的游戏循环。

最佳答案

GUI 应该只负责渲染。所有实际的游戏逻辑都应该在主线程上处理,而 EDT 正在为您绘制(重绘将事件发送到 EDT)。至于“invokingGameLogic”,这首先不应该在构造函数中完成(考虑到该方法包含更新游戏的循环)。您应该 initFrame 然后启动专门用于更新/渲染游戏的循环。创建更新和渲染之间的接口(interface);具有渲染代码和更新代码都可以访问的变量。这样,您的渲染代码就会渲染当前状态,而更新代码会更改它。

class Game extends Canvas {
    //the items used between render and update
    Player player;
    Enemy player;

    //render values
    public void paint(Graphics g) {
        super.paint(g);

        g.setColor(Color.BLUE);
        g.fillRect(player.x, player.y, 50, 50);

        g.setColor(Color.RED);
        g.fillRect(enemy.x, enemy.y, 50, 50);
    }

    //affect values
    public void update() {
         player.x++;
    }
}

让游戏逻辑远离渲染。它使游戏编程变得更容易,因为您将能够轻松找到处理图形的代码,以及哪些代码处理移动的玩家,哪些不处理。

如果您使用Component#paint(Graphics),那么您确实希望将游戏逻辑与渲染分开。 Paint 方法中的代码在事件调度线程中执行,这意味着更新问题将导致 GUI 中出现非常明显的问题。

关于java - JFrame 中的游戏逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462784/

相关文章:

Java Swing 游戏随着时间的推移而滞后

java - java 中我的框架上的 Jbutton 位置不起作用

java - 如何为 Kotlin 和 Gradle 设置 "sourceCompatibility"?

java - For循环输出特定模式

java - 使用复合 JPanel 单元格编辑器编辑后 JTable 失去焦点

java - 重绘方法在短暂延迟后停止工作

java - 使用invokeLater 和不使用invokeLater 显示JFrame 有什么区别?

java - 框架中有多个 JPanel/具有背景图像和顶部有组件的另一层

java - 在 android studio 中的每个新项目中获取 [不幸的是应用程序停止工作],但不是

java - 在我的网络应用程序中设置时区