2015-05-14 109 views
0

我在pause後遇到了恢復遊戲的問題。我使用SurfaceView,這裏是代碼的最重要的部分:如何暫停和恢復GameLoop?

void pause() { 
    if (!pause) { 
     gameLoopThread.setRunning(false); 
     pause = !pause; 
     System.out.println("pause"); 
    } 
    else { 
     gameLoopThread.setRunning(true); 
     System.out.println("end pause"); 
     pause = !pause; 
    } 
} 

public GameView(Context context) { 
    super(context); 
    gameLoopThread = new GameLoopThread(this); 

    getHolder().addCallback(new SurfaceHolder.Callback() { 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 
      boolean retry = true; 
      gameLoopThread.setRunning(false); 

      while (retry) { 
       try { 
        gameLoopThread.join(); 
        retry = false; 
       } catch (InterruptedException e) {} 
      } 
     } 

     @Override 
     public void surfaceCreated(SurfaceHolder holder) { 
      //createSprites(); 

      gameLoopThread.setRunning(true); 
      gameLoopThread.start(); 
      thread1.start(); 
     } 

     @Override 
     public void surfaceChanged(SurfaceHolder holder, int format, 
            int width, int height) 
     { 
     } 

當我使用pause第一次,比賽停止,但是當我試圖用它不pause秒時間恢復遊戲不起作用,但我在日誌中打印了「結束暫停」。

+1

我想GameLoopThread是一個從線程遺留下來的自定義類。你能告訴我們這個班上用於暫停的代碼嗎? – Nic007

+0

您是否看過堆棧跟蹤以查看線程狀態? – fadden

回答

0

通常你不會暫停整個線程在你的遊戲中暫停。當你更新時,渲染通常應該包含任何delta時間對象,你應該爲你的delta時間對象實現一個新組件,叫做時間尺度。時間尺度只是自行疊加時間增量以返回修改的增量時間。所以現在如果你想暫停你的遊戲,只需將時間刻度設置爲0,並且你不再做任何動作,並且你仍然可以運行更新,渲染隊列來修改事物,動畫或其他任何東西。

另一種方法可以是給每個實體,讓我們說在你的基本實體中,一個暫停的屬性。然後你通過你的實體發送一條消息,讓我們說暫停遊戲,暫停的屬性get設置爲true。在你的基本實體的虛擬更新只是檢查暫停,如果設置返回。

secound是一個更先進的,比第一個有一些優勢的優勢,但是如果它存在的話,至少需要一個很好的ur實體/組件概念設計。