Я создаю собственный движок для подземелья.У меня есть работающий 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();
}
Класс, который все это выполняет, называется setup:
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 с половиной часов, так что скоро я могу сойти с ума.