Java Maze SwingWorker - пользовательский ввод вызывает проблемы - PullRequest
0 голосов
/ 01 мая 2020

У меня есть лабиринт, где монстр перемещается к игроку каждую 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();       
}
...