gpt4 book ai didi

Java游戏卡顿,if语句太多?

转载 作者:行者123 更新时间:2023-12-01 18:04:19 26 4
gpt4 key购买 nike

我正在开发一款基于 Atari 游戏冒险的 Java 游戏。我让基本的 KeyListener 部分工作正常,但随后我添加了另一个 if 语句,使用另一个类来测试玩家是否会撞到墙上,如果是这种情况则停止移动。我使用的方法也使用了 if 语句,当我运行代码时,它有很大的滞后。我首先尝试了 while 循环,但这使得它的滞后更加严重。无论如何要让这不那么滞后?运行起来似乎并不复杂,而且我仍然需要添加另一个 if 语句才能移动到另一个房间,所以我必须做一些事情来大幅减少延迟。

这是类(class):

class Player extends JPanel implements KeyListener{
private char c = 'e';
int x = 400;
int y = 400;
int mapX = 0;
int mapY = 0;


public Player() {
this.setPreferredSize(new Dimension(800, 500));
addKeyListener(this);
}

public void addNotify() {
super.addNotify();
requestFocus();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Environment Layout = new Environment();
Layout.drawRoom(mapX,mapY,g);
g.fillRect(x , y , 20, 20);
}
public void keyPressed(KeyEvent e) { }
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) {
c = e.getKeyChar();
repaint();
Environment Layout = new Environment();
if(Layout.isWall(x,y,c)){}
else{
if (c == 'a'){
x = x - 3;
}
else if (c == 'w'){
y = y - 3;
}
else if (c == 's'){
y = y + 3;
}
else if (c == 'd'){
x = x + 3;
}
}
}

public static void main(String[] s) throws IOException{
JFrame f = new JFrame();
f.getContentPane().add(new Player());
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}

我在此使用的绘图室方法只是将房间的背景放置到位。

这是环境类中的 isWall 方法:

public boolean isWall(int moveX, int moveY, char let){
BufferedImage room = null;
try {
room = ImageIO.read(new File(xNum + "," + yNum + ".png"));
}
catch (IOException e) {
}
int[][] walls = convertImage(room);
boolean blocked = false;
if(let == 'w') {
if(walls[moveY-8][moveX] == -3584){blocked = true;}
}
else if(let == 's') {
if(walls[moveY+20][moveX] == -3584){blocked = true;}
}
else if(let == 'a') {
if(walls[moveY][moveX-5] == -3584){blocked = true;}
}
else if(let == 'd') {
if(walls[moveY][moveX+20] == -3584){blocked = true;}
}
return blocked;
}

convertImage 方法只是将房间的图像转换为 int 数组,作为颜色值。 -3584 是墙壁的颜色。这可能是滞后的原因,但这似乎是每个房间自动完成墙壁的最佳方式。

我也尝试过计时器,但要么我做错了,要么就是没有帮助。

如果需要,我可以提供更多我的代码,但对此提供帮助将不胜感激。我对这类东西比较陌生,所以很可能我错过了一些大东西。谢谢。

最佳答案

这里的滞后几乎肯定不是来自 if 语句。这些真的很快。我认为更大的问题是在 isWall 中。请注意,任何时候您想要检查墙是否存在,您都可以

  1. 打开文件,
  2. 读取文件内容,
  3. 将文件内容从图像转换为像素网格,并且
  4. 精确读取一个像素。

与查看内存中的值相比,从磁盘读取文件极其慢。例如,常规磁性硬盘驱动器的工作速度约为 7200 RPM,因此寻道时间以毫秒为单位。另一方面,您的处理器每秒可以执行大约十亿次操作,因此其他操作需要纳秒。这意味着磁盘读取比其他操作大约慢一百万倍,这几乎肯定是您获得延迟的原因!

要解决此问题,请考虑重写您的 isWall 代码,以便您只读取文件并进行一次转换,完成后,只需查找您需要的图像部分。这会将大量(极其缓慢)的文件读取转换为一次(缓慢但不可避免)的文件读取,然后进行大量快速内存读取。

关于Java游戏卡顿,if语句太多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956973/

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