gpt4 book ai didi

java - 创建游戏循环线程

转载 作者:行者123 更新时间:2023-11-30 07:18:47 25 4
gpt4 key购买 nike

您好,我刚才一直在搞乱多边形和 awt。我已经创建了一个 Jframe 并且可以绘制多边形并让其中之一随着按键移动。

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

通过谷歌搜索,我相信我应该有一个线程用于用户输入,一个线程用于游戏本身。

目前我已经在板类上实现了 KeyListener(代码如下所示),我应该把它放到它自己的类中并让它实现可运行吗?按照代码的原样,我在 keypressed() 方法中重新绘制了 JFrame所以我可以看到它正确移动

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

另外,虽然我是从在线教程中学习的,但我应该使用 JPanel 而不是 JFrame 和 paintComponent() 而不是 paint() 吗?

    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;

import javax.swing.JFrame;

public class Board extends JFrame implements KeyListener{
AffineTransform identity = new AffineTransform();
Graphics2D g2d;

Ship ship = new Ship();

public static final int ALIENS = 3;
Alien[] alien = new Alien[ALIENS];


Board(){
super("The Board");
setSize(1280,1024);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setBackground(Color.BLACK);
for(int x=0;x<ALIENS;x++){
alien[x]=new Alien();
}
}

public void paint(Graphics g){
super.paint(g);
addKeyListener(this);
//draw ship
g2d = (Graphics2D)g;
g2d.setTransform(identity);
g2d.translate(ship.getxPos(),ship.getyPos());
g2d.scale(2,2);
g2d.setColor(Color.ORANGE);
g2d.fill(ship.getShape());
g2d.setColor(Color.BLACK);
g2d.draw(ship.getShape());

// draw aliens
for(int x=0;x<ALIENS;x++){
//if alien alive
if(alien[x].isAlive()){
//draw alien
g2d = (Graphics2D)g;
g2d.setTransform(identity);
g2d.translate(alien[x].getxPos(),alien[x].getyPos());
g2d.scale(2,2);
g2d.setColor(Color.BLUE);
g2d.fill(alien[x].getShape());
g2d.setColor(Color.BLACK);
g2d.draw(alien[x].getShape());
}
}
}//end paint


/*****************************************************
* key listener events
*****************************************************/
public void keyReleased(KeyEvent k) { }
public void keyTyped(KeyEvent k) { }
public void keyPressed(KeyEvent k) {
int keyCode = k.getKeyCode();

switch (keyCode) {

case KeyEvent.VK_A:
//move ship left
if(ship.getxPos()<20){
ship.setxPos(20);
}else
ship.setxPos(ship.getxPos()-1);
break;
case KeyEvent.VK_D:
if(ship.getxPos()>1260){
ship.setxPos(1260);
}else
ship.setxPos(ship.getxPos()+1);
}
repaint();
}//end keypressed event

public static void main(String[] args){
new Board();
}
}

最佳答案

这些答案在某种程度上取决于您要创建的游戏类型。

From googling I'm led to believe that I should have one thread for user input and one for the game itself.

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

while (running) {
update game model
draw game
wait x milliseconds
}

您的用户输入将直接更新游戏模型。如果计算机需要移动或对您的移动使用react,游戏循环会更新游戏模型。然后,游戏循环读取游戏模型并根据模型中的值绘制游戏。

At the moment I have implemented KeyListener on the board class(code shown below),should I put that out into its own class and make it implement runnable?

是的,您应该将 KeyListener 放入它自己的类中。不,您不必将其设为单独的线程。

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

这是你如何做到的。

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Board();
}
});
}

Should I use JPanel instead of JFrame and paintComponent() instead of paint()?

是的。

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

有些人会不同意我的看法,但我发现如果游戏中的每个对象都有一个 draw 方法来绘制自己是最好的。

public void draw(Graphics g)

游戏模型还有一个 draw 方法,它绘制模型中的所有对象。

JPanel paintComponent 方法如下所示:

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

关于java - 创建游戏循环线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15120128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com