有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案