2011-12-03 28 views
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; 

然后,我有一个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()); 
     } 
    } 
}; 

那里剔每秒都会在游戏中引发一个动作。

我会认为这会让游戏在按下按钮时暂停,然后再按下按钮时取消暂停,但是我会错误的。我究竟做错了什么?

+0

是'aTask'包含游戏逻辑,如果不是这是什么?游戏逻辑循环在哪里? – havexz

+0

这是一个0人游戏? http://www.technicalypto.com/2011/08/conways-game-of-life-in-java.html是一个需要暂停的0人游戏例子。如果其单人玩家,请展示更多代码。 – bragboy

+0

为什么试着睡觉,什么时候可以循环检查暂停状态?我猜你仍然可能需要渲染屏幕或保存某种状态以防崩溃? –

回答

5

只要试试这个:

public void pause(){ 
    data.paused = !data.paused; 
} 

它看起来像一个线程的问题。如果使用Swing,并且您的暂停方法绑定到动作侦听器,则行为是正常的:暂停函数永不返回,Swing主线程再也不会控制,并且无法管理其他操作,包括解除暂停操作...查看this link

我的解决方案简单地反转暂停变量的状态,并将控制返回给Swing。根据这个变量的状态,它会根据游戏的主循环来确定数据的大小。没有线程被阻塞,主循环继续循环。

+0

很难说如果这是正确的或没有,因为我们还没有听到原始的海报,但它听起来不错。 1+ –

+0

“气垫船充满鳗鱼”:D:D:D – solendil

+0

谢谢,这个工程,对不起,我没有更好地回应这个问题,但这种解决方案似乎工作。我可以提供更多细节是否会帮助别人。 –