我正在尝试用 Java 制作一个简单的 2D 游戏。
到目前为止我有一个JFrame
,带有一个菜单栏,以及一个扩展的类JPanel
并覆盖它paint
方法。现在,我需要开始一个游戏循环,我将在其中更新图像的位置等。然而,我一直在思考如何最好地实现这一目标。我应该使用多线程吗?因为如果你在主线程上放置无限循环,UI(以及我的菜单栏)肯定会冻结?
到目前为止,这是我的代码:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class GameCanvas extends JPanel {
public void paint(Graphics g) {
while (true) {
g.setColor(Color.DARK_GRAY);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
@SuppressWarnings("serial")
public class Main extends JFrame {
GameCanvas canvas = new GameCanvas();
final int FRAME_HEIGHT = 400;
final int FRAME_WIDTH = 400;
public static void main(String args[]) {
new Main();
}
public Main() {
super("Game");
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("File");
JMenuItem startMenuItem = new JMenuItem("Pause");
menuBar.add(fileMenu);
fileMenu.add(startMenuItem);
super.add(canvas);
super.setVisible(true);
super.setSize(FRAME_WIDTH, FRAME_WIDTH);
super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
super.setJMenuBar(menuBar);
}
}
有什么指示或技巧吗?我应该把我的循环放在哪里?在我的主类中,还是在我的 GameCanvas 类中?
您的游戏循环(模型)不应位于任何 GUI 类(视图)附近。它使用您的 GUI 类——但即使您可能想通过中介(控制器)来完成。确保正确执行的一个好方法是检查您的模型是否没有单个“include javax.swing.???”。
你能做的最好的事情就是让游戏循环保持在它自己的线程中。每当您想在 GUI 中进行更改时,请使用 SwingWorker 或小孩子现在使用的任何东西将其强制到 GUI 线程上以执行该操作。
这实际上很棒,因为它让您思考 GUI 操作(这将构成您的控制器)。例如,您可能有一个名为“Move”的类,其中包含移动背后的 GUI 逻辑。您的游戏循环可能会使用正确的值(要移动的项目、最终位置)实例化“移动”,并将其传递给 GUI 循环进行处理。
一旦达到这一点,您就会意识到,只需为每个 GUI 操作添加一个简单的“撤消”即可轻松撤消任意数量的操作。您还会发现用 Web GUI 替换 Swing GUI 更容易...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)