swing Java迷宫SwingWorker用户输入导致问题
我有一个迷宫,怪物每1秒向玩家移动一次。它工作得非常好,直到我使用KeyListener移动播放器。移动玩家后,MoveMonster方法仍会每1秒调用一次,但用户输入后MoveMonster似乎不会移动怪物。 我不太擅长多线程。我使用ScheduledExecutorService调用MonsterMover()的逻辑正确吗?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();
}
共 (0) 个答案