У меня есть лабиринт, где монстр перемещается к игроку каждую 1 секунду. Он прекрасно работает, пока я не переместу плеер с помощью KeyListener. После перемещения проигрывателя метод MoveMonster по-прежнему вызывается каждую 1 секунду, но MoveMonster, похоже, не перемещает монстра после пользовательского ввода. Я не так хорош с MultiThreading. Мой лог c использует ScheduledExecutorService для вызова MonsterMover (), который использует SwingWorker для правильного вызова SwapCell ()? Последний вопрос: когда я отлаживаю, я не могу переместить проигрыватель, т. Е. Пользовательский ввод addKeyListener () не работает, что затрудняет отладку.
public class Game extends JPanel {
private Player player;
private Monster monster;
public Game(int xSize, int ySize) {
player = new Player(0,0);
monster = new Monster(0,1);
setLayout(new GridLayout(ySize, xSize));
addLevel();
// Move Player Up, Down, Left or Right
addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent event) {
swapCells(getCurrentLevel().getMap()[x+dx][y+dy], getCurrentLevel().getMap()[x][y], player);
}
}
});
// Move Monster every 1 second
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
executor.scheduleAtFixedRate(() -> moveMonster(), 0L, 1000L, TimeUnit.MILLISECONDS);
} // End of Main Function
public void swapCells(Cell cell1, Cell cell2, Mover mover) {
// Basically swap Cell1 with Cell2
}
public void moveMonster() {
SwingWorker<Void, Cell> worker = new SwingWorker<Void, Cell>() {
@Override
protected Void doInBackground() throws Exception {
swapCells(getCurrentLevel().getMap()[nextCell.getX()][nextCell.getY()], getCurrentLevel().getMap()[monster.getX()][monster.getY()], monster);
return null;
}
};
worker.execute();
}