我正在为地牢爬行者构建自定义引擎。我有一个可以正常工作的KeyLogger,可以使用KeyListener来检测击键。
我在引擎内还有一个JFrame c和一个函数paint(),该函数生成框架并告诉c repaint()。第三,我有一个move()函数,可以根据按下的键更改玩家的坐标。
KeyListener:
KeyListener kl = new KeyListener() {
@Override
public void keyPressed(KeyEvent k) {
if (k.getKeyChar() == 'w') {
my = 1;
} else if (k.getKeyChar() == 's') {
my = -1;
}
if (k.getKeyChar() == 'a') {
mx = 1;
} else if (k.getKeyChar() == 'd') {
mx = -1;
}
}
@Override
public void keyReleased(KeyEvent k) {
if (k.getKeyChar() == 'w' || k.getKeyChar() == 's') {
my = 0;
}
if (k.getKeyChar() == 'a' || k.getKeyChar() == 'd') {
mx = 0;
}
}
};
move():
void move() {
System.out.println("Moving by x: " + mx + " y: " + my);
player.move(10 * mx, 10 * my);
paint();
}
和paint()函数:
public void paint() {
System.out.println("Paint Engine");
Graphics g = Frame.getGraphics();
//Generate Frame
c.repaint();
}
运行所有这些的类称为安装程序:
public void setup() {
LevelGen lg = new LevelGen();
c.addKeyListener(kl);
lg.generateLevel(0);
walls = lg.getWalls();
player = lg.getPlayer();
paint(); // does not get executed with the while-loop but without
while(true){ //Please sebd help
move();
paint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
如果我将move()和paint()命令放在KeyListener或类的主函数中,则所有内容都可以像超级按钮一样工作,但是如果将它放入了while(true)循环中,或者在主函数中,或者在新函数中不会检测到KeyStrokes的线程,也不会执行循环/线程的最前面的paint()命令。
我也曾尝试删除Thread.sleep,但这绝对不会改变。快速说明:以任何方式添加循环时,Alt + F4也会停止工作。
在过去的6 1/2个小时里,我一直在解决这个问题,所以我可能很快就会发疯了。