while循环阻止我的听众工作

时间:2017-10-18 14:23:38

标签: java game-loop

好的,所以我正在进行桌面游戏。 第一个'while循环'检查游戏是否结束,内部'while循环'应该等待用户输入(squareSelector和rooSelector是我的mouselisteners,'k'和's'是应该是的输入由听众返回) 然而,'while循环'崩溃我的程序并阻止我的听众工作。 我读到了这一点,发现swing是单线程的,所以我的听众在whileloop处于活动状态时无法工作。但是我需要等待输入以避免无效指针。 关于如何解决这个问题的任何想法? (如在不同的方法中,或如何使我的循环等待输入)

the gameloop

while(currentPlayer.haveIWon() == false){
        //wait for input
        while(!inputIsDone){
            System.out.println("waiting for move");
            System.out.println(squareSelector.isDone() + " " + rooSelector.isDone()) ;
            checkInput() ;
            if(squareSelector.isDone() && rooSelector.isDone()){
                inputIsDone = true ;
            }
        }
        //update board
        currentPlayer.performMove(k, s);
        rooSelector.setDone(false);
        squareSelector.setDone(false);
        inputIsDone = false ;
        //currentPlayer.setInput(false);
        //repaint
        Main.getState().getComponent().repaint();

    }
    //display winnner thing

checkInput方法

public void checkInput(){
    if(rooSelector.getSelected() != null){
        k = rooSelector.getSelected() ;
    }
    if(squareSelector.getSelected() != null){
        s = squareSelector.getSelected() ;
    }
}

如果您需要更多代码来了解正在发生的事情让我知道,我会添加更多。

1 个答案:

答案 0 :(得分:0)

Swing是单线程的。由于其设计,与GUI相关的所有内容都必须在Swing线程上完成,也称为事件派发线程。它基本上做了一件事:查看事件队列,如果有东西,它会处理它,如果没有,就会进入休眠状态。每次鼠标移动,按键,重新绘制等都是事件队列中的事件。

如果您的游戏仅对GUI事件做出反应并且没有冗长的操作,则您不必使用任何特殊的操作。您可以在没有while的情况下编写逻辑,这样它就不会阻塞,只会对事件做出反应。但是,这种可能性完全取决于您要实施的目标。

如果您有任何长时间阻塞线程的操作,您将需要使用单独的线程。这样,其他线程不会影响您的GUI,但是您需要非常小心地将数据从一个线程发送到另一个线程或者在另一个线程上调用某些东西。