【发布时间】:2016-06-22 01:06:43
【问题描述】:
我正在开发一款基于 Atari 游戏冒险的 Java 游戏。我得到了基本的 KeyListener 部分工作正常,但随后我添加了另一个 if 语句,使用另一个类来测试玩家是否会撞墙,如果是这样,则停止移动。我使用的方法也使用了 if 语句,当我运行代码时,它有很大的滞后。我先尝试了一个while循环,但这使它滞后更糟。无论如何,让这不会滞后这么多?运行一个程序似乎并不复杂,我仍然需要添加另一个 if 语句才能移动到另一个房间,所以我必须做一些事情来大幅减少延迟。
这是课程:
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);
}
}
我这里使用的draw room方法只是将房间的背景放置到位。
这里是 Environment 类的 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 是墙壁的颜色。可能这是滞后的原因,但这似乎是每个房间自动完成墙壁的最佳方式。
我也尝试了一个计时器,但要么我做错了,要么就是没有帮助。
如果需要,我可以提供更多我的代码,但我们将不胜感激。我对这种东西比较陌生,所以我很可能错过了一些重要的东西。谢谢。
【问题讨论】:
标签: java jpanel keylistener