在java应用程序中暂停游戏

在java应用程序中暂停游戏,java,Java,我正在尝试将暂停功能添加到游戏中。不幸的是,我目前使用的方法导致程序不再接受输入,因此我无法恢复游戏 以下是我目前正在做的事情: 暂停按钮调用: public void pause(){ if(data.paused == true){ data.paused = false; } else{ data.paused=true; while(true){ if(data.paused == true)

我正在尝试将暂停功能添加到游戏中。不幸的是,我目前使用的方法导致程序不再接受输入,因此我无法恢复游戏

以下是我目前正在做的事情:

暂停按钮调用:

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;
然后我要处理一个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() );
        }
    }
};
滴答声每秒钟在游戏中引起一个动作

我想这会让游戏在按下按钮时暂停,然后在再次按下按钮时取消暂停,但我错了。我做错了什么?

试试这个:

public void pause(){
  data.paused = !data.paused;
}
看起来像是线程问题。如果您使用Swing并且您的pause方法绑定到一个动作侦听器,那么这种行为是正常的:pause函数永远不会返回,Swing主线程再也没有控制权,并且无法管理进一步的动作,包括取消暂停。。。看

我的解决方案只是反转pause变量的状态,并将控制权交还给Swing。游戏主循环将根据变量的状态勾选数据或不勾选数据。没有线程被阻塞,主循环继续循环。

只需尝试以下操作:

public void pause(){
  data.paused = !data.paused;
}
看起来像是线程问题。如果您使用Swing并且您的pause方法绑定到一个动作侦听器,那么这种行为是正常的:pause函数永远不会返回,Swing主线程再也没有控制权,并且无法管理进一步的动作,包括取消暂停。。。看


我的解决方案只是反转pause变量的状态,并将控制权交还给Swing。游戏主循环将根据变量的状态勾选数据或不勾选数据。没有线程被阻塞,主循环继续循环。

是否
aTask
包含游戏逻辑,如果不是,这是为了什么?游戏逻辑循环在哪里?这是一个0人游戏吗?是一个需要暂停的0人游戏示例。如果它是一个播放器,请显示更多的代码。当你可以循环检查暂停状态时,为什么要尝试睡眠?我猜你可能仍然需要渲染屏幕或保存某种状态以防崩溃?如果你添加问题,你可以更快地获得帮助。这是Swing吗?你是否暂停了EDT(Swing事件线程)?aTask是否包含游戏逻辑,如果不是,这是为了什么?游戏逻辑循环在哪里?这是一个0人游戏吗?是一个需要暂停的0人游戏示例。如果它是一个播放器,请显示更多的代码。当你可以循环检查暂停状态时,为什么要尝试睡眠?我猜你可能仍然需要渲染屏幕或保存某种状态以防崩溃?如果你补充你的问题,你可以更快地获得帮助。这是Swing吗?你是否暂停了EDT(Swing事件线程)?很难说这是正确的还是错误的,因为我们还没有从原始海报上听到,但我觉得这听起来不错。1+“满是鳗鱼的气垫船”:D:D:D汉克斯,这个有效,对不起,我没有对这个问题做出更多的反应,但这个解决方案似乎有效。我可以说更多的细节是它会帮助其他人。很难说这是正确的还是错误的,因为我们还没有从最初的海报上听到,但对我来说听起来不错。1+“满是鳗鱼的气垫船”:D:D:D汉克斯,这个有效,对不起,我没有对这个问题做出更多的反应,但这个解决方案似乎有效。我可以说得更详细一些,因为这会帮助其他人。