2011-12-03 45 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

謝謝,這個工程,對不起,我沒有更好地迴應這個問題,但這種解決方案似乎工作。我可以提供更多細節是否會幫助別人。 –