Java 创建游戏循环线程

Java 创建游戏循环线程,java,game-loop,Java,Game Loop,嗨,我刚刚在搞多边形和awt。我已经创建了一个Jframe,可以绘制多边形ok,并用按键移动其中一个多边形 我想知道如何启动一个gameloop线程(以及放在哪里!),它将独立地更新jframe 谷歌的即时通讯让我相信,我应该有一个线程用于用户输入,一个线程用于游戏本身 目前,我已经在board类上实现了KeyListener(如下所示的代码),我是否应该将其放入自己的类中并使其实现可运行?在代码中,我在keypressed()方法中重新绘制了JFrame,这样我就可以看到它正确移动了 一天中的

嗨,我刚刚在搞多边形和awt。我已经创建了一个Jframe,可以绘制多边形ok,并用按键移动其中一个多边形

我想知道如何启动一个gameloop线程(以及放在哪里!),它将独立地更新jframe

谷歌的即时通讯让我相信,我应该有一个线程用于用户输入,一个线程用于游戏本身

目前,我已经在board类上实现了KeyListener(如下所示的代码),我是否应该将其放入自己的类中并使其实现可运行?在代码中,我在keypressed()方法中重新绘制了JFrame,这样我就可以看到它正确移动了

一天中的大部分时间都是这样,我自己非常非常困惑:) 一如既往,非常感谢您的帮助

另外,当我在在线辅导课上学习时,我应该使用JPanel而不是JFrame,使用paintComponent()而不是paint()

导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.KeyEvent;
导入java.awt.event.KeyListener;
导入java.awt.geom.AffineTransform;
导入javax.swing.JFrame;
公共类板扩展JFrame实现KeyListener{
AffineTransform标识=新的AffineTransform();
图形2d-g2d;
船舶=新船舶();
公共静态最终整数=3;
外国人[]外国人=新的外国人[外国人];
董事会(){
超级(“董事会”);
设置大小(12801024);
setVisible(真);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setBackground(颜色为.BLACK);

对于(intx=0;x来说,这些答案在某种程度上取决于您试图创建的游戏类型

谷歌让我相信,我应该有一个线程用于用户输入,一个线程用于游戏本身

您创建了一个主游戏循环,它在自己的线程中运行

while (running) {
    update game model
    draw game
    wait x milliseconds
} 
您的用户输入将直接更新游戏模型。如果需要计算机进行移动或对您的移动做出反应,游戏循环将更新游戏模型。然后,游戏循环读取游戏模型并根据模型中的值绘制游戏

目前我已经在board类上实现了KeyListener(代码如下所示),我是否应该将其放入自己的类中并使其实现可运行

是的,您应该将KeyListener放在它自己的类中。不,您不必使它成为一个单独的线程

为了避免将来的麻烦,应该在事件分派线程上定义和使用Swing组件

这是你怎么做到的

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Board();
        }
    });
}
我应该使用JPanel而不是JFrame,使用paintComponent()而不是paint()

JFrame中应该有一个JPanel。JPanel是使用paintComponent方法执行绘图游戏代码的地方

有些人可能会不同意我的观点,但我发现最好是游戏中的每个对象都有自己的绘制方法

public void draw(Graphics g)
游戏模型还将有一个绘制方法,用于绘制模型中的所有对象

JPanel paintComponent方法如下所示:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    gameModel.draw(g);
}

这些答案在某种程度上取决于你想要创造什么样的游戏

谷歌让我相信,我应该有一个线程用于用户输入,一个线程用于游戏本身

您创建了一个主游戏循环,它在自己的线程中运行

while (running) {
    update game model
    draw game
    wait x milliseconds
} 
您的用户输入将直接更新游戏模型。如果需要计算机进行移动或对您的移动做出反应,游戏循环将更新游戏模型。然后,游戏循环读取游戏模型并根据模型中的值绘制游戏

目前我已经在board类上实现了KeyListener(代码如下所示),我是否应该将其放入自己的类中并使其实现可运行

是的,您应该将KeyListener放在它自己的类中。不,您不必使它成为一个单独的线程

为了避免将来的麻烦,应该在事件分派线程上定义和使用Swing组件

这是你怎么做到的

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            new Board();
        }
    });
}
我应该使用JPanel而不是JFrame,使用paintComponent()而不是paint()

JFrame中应该有一个JPanel。JPanel是使用paintComponent方法执行绘图游戏代码的地方

有些人可能会不同意我的观点,但我发现最好是游戏中的每个对象都有自己的绘制方法

public void draw(Graphics g)
游戏模型还将有一个绘制方法,用于绘制模型中的所有对象

JPanel paintComponent方法如下所示:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    gameModel.draw(g);
}