我有一个Jpanel,我画了一个级别的游戏。我的问题是该方法不会重绘图像。我究竟做错了什么? 如果我在keyLister中调用repaint(),那么jpanel会被重新绘制,但是runnable没有重要性......
感谢您的帮助!!!!
public class Board extends JPanel implements Runnable {
private Map map;
private Player player;
public Board(String path) {
this.map = new Map(path);
this.jugador = new Jugador();
addKeyListener(new Al());
this.setFocusable(true);
}
public void paint(Graphics g) {
super.paint(g);
for (int y = 0; y < 23; y++) {
for (int x = 0; x < 37; x++) {
if (map.getLab(x, y).equals("f")) {
g.drawImage(map.getImgFinish(), x * map.getTamImagen(), y * map.getTamImagen(), null);
}
if (map.getLab(x, y).equals("g")) {
g.drawImage(map.getImgGrass(), x * map.getTamImagen(), y * map.getTamImagen(), null);
}
if (map.getLab(x, y).equals("w")) {
g.drawImage(map.getImgWall(), x * map.getTamImagen(), y * map.getTamImagen(), null);
}
}
player.drawPlayer(g, player.getCoorX() * map.getTamImagen(), player.getCoorY() * map.getTamImagen());
}
}
public void run() {
while (true) {
repaint();
}
}
public class Al extends KeyAdapter {
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_LEFT) {
if (!map.getLab(player.getCoorX() - 1, player.getCoorY()).equals("w")) {
player.move(-1, 0);
}
}
if (keyCode == KeyEvent.VK_RIGHT) {
if (!map.getLab(player.getCoorX() + 1, player.getCoorY()).equals("w")) {
player.move(1, 0);
}}}}}
答案 0 :(得分:3)
这是一个非常紧张的while循环,一个可能会占用CPU的风险完全导致GUI无用。不要像你正在做的那样循环,而是在事件发生时响应事件要好得多。例如,如果要在按下某个键时更改视图,则在收到按键被通知的通知后调用repaint()
,而不是在紧密的while循环中。您可以使用KeyListener进行此操作,但要了解这些在组件焦点方面非常小,为此(以及其他原因)您最好使用Key Bindings。
如果由于其他原因需要运行游戏循环,请不要让它太紧 - 如果没有Thread.sleep或其中有任何中断。为了Swing线程安全的利益,你最好不要使用while循环,而是使用Swing Timer代替。