在Java应用程序中暂停游戏

Dan*_*ill 0 java

我正在尝试为游戏添加暂停功能.不幸的是,我目前使用的方法导致程序不再需要输入,所以我无法恢复游戏.

这是我目前正在做的事情:

暂停按钮调用:

public void pause(){
    if(data.paused == true){
        data.paused = false;
    }
    else{
        data.paused=true;
        while(true){
            if(data.paused == true){
                try{
                    Thread.currentThread().sleep(100);
                }
                catch(InterruptedException ie){
                    System.out.println(ie);
                }
            }
            else
                break;
        }
        data.paused=false;
    }
  return;
Run Code Online (Sandbox Code Playgroud)

然后我有一个我必须处理的TimerTask:

class aTask extends java.util.TimerTask {
    protected Data data;
    public aTask( Data d ) { data = d; }
    public void run() { 
        try{ 
            if(data.paused){
                try{
                    Thread.currentThread().sleep(100);
                }
                catch(InterruptedException ie){
                    System.out.println(ie);
                }
            }
            else
                data.tick(); 
        } 
        catch( ATCGameOverException e ){ 
            data.gameOver( e.getMessage() );
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

tick每秒钟在游戏中引起一次动作.

我认为这将允许游戏在按下按钮时暂停,然后在再次按下按钮时取消暂停,但我会错.我究竟做错了什么?

sol*_*dil 5

试试这个:

public void pause(){
  data.paused = !data.paused;
}
Run Code Online (Sandbox Code Playgroud)

它看起来像一个线程问题.如果你使用Swing并且你的pause方法与一个动作监听器绑定,那么行为是正常的:暂停函数永远不会返回,Swing主线程再也没有控制权,并且无​​法管理进一步的动作,包括取消暂停......看看这个链接

我的解决方案只是简单地反转暂停变量的状态,并将控制权交还给Swing.这是游戏主循环,它将根据此变量的状态来勾选数据.没有线程被阻塞,主循环继续循环.