3

我可以通過使我的遊戲線程(其中保持/與surfaceview同步)wait/notifyAll來暫停/恢復我的遊戲。這一切都運行良好使用遊戲暫停按鈕。但是,當我點擊主頁/後退按鈕時,我可以暫停我的遊戲,但是當我通過單擊其圖標繼續遊戲時,我會收到無響應的遊戲屏幕。Android:遊戲循環暫停/恢復問題

我在OnResume()方法上放置了日誌,但沒有任何內容被打印到LogCat中! 如果我點擊我的遊戲屏幕,我會在我的遊戲活動中看到「強制關閉」或「等待」錯誤對話框。

爲什麼我得到這個無響應的屏幕就好像我的應用程序暫停後掛起? 如何以與遊戲暫停/恢復按鈕相同的方式處理物理按鈕?

這裏是我的logcat操作視圖。你可以看到onResume sop沒有得到類似於onPause的打印。

LogCat View

編輯:代碼由我暫停/恢復按鈕,並在onPause /的onResume功能 其中 「這」 是線程類本身

protected void setPause(){ 
     synchronized (this) { 
      isPaused = true; 
       } 
    } 

    protected void setResume(){ 
     synchronized (this) { 
      isPaused = false; 
      this.notifyAll(); 
     } 
    } 

遊戲循環代碼調用:

synchronized (this) { 
      while (running) { 
       if (isPaused) { 
        try { 
         this.wait(); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } else { 
        Canvas c = null; 

        try { 
         c = view.getHolder().lockCanvas(); 
         synchronized (view.getHolder()) { 
          view.onDraw(c); 
         } 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } finally { 
         if (c != null) { 
          view.getHolder().unlockCanvasAndPost(c); 
         } 
        } 
        sleepTime = ticksPS 
          - (System.currentTimeMillis() - startTime); 
        try { 
         if (sleepTime > 0) 
          sleep(sleepTime); 
         else 
          sleep(10); 
        } catch (Exception e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      } 
     } 

這個我怎麼稱它從表面看:

public void surfaceCreated(SurfaceHolder holder) { 

       // start the game loop 
       System.out.println("Starting Game Loop @@@@@@@@@"); 
       if(isPaused){ 
        System.out.println("GamePaused"); 
        gameLoopThread.setResume(); 
       } 
       else{ 
        System.out.println("Game Starting"); 
        gameLoopThread.setRunning(true); 
       } 
       gameLoopThread.start(); 

      } 

編輯2: 如果我使用暫停按鈕暫停我的遊戲,並讓我的手機自動鎖定...恢復後,我可以正常播放任何問題。 根據日誌我看到在這種情況下表面被破壞不會被調用。

+0

OnResume和OnPause代碼說的是什麼? – Araw

+0

檢查我編輯 –

+0

的帖子上的更新我假設你暫停遊戲的方法「睡覺」在UI線程上。 這不是做到這一點的方法。向我們展示如果遊戲正在執行的代碼 – IncrediApp

回答

1

onResume之後,您的SurfaceView被再次創建,但它丟失了之前的所有數據(onDraw所需的所有信息)。您必須將數據保存在surfaceDestroyed或之前,然後將其重新加載到您的Surfaceview的onCreate

+0

我該怎麼做? 我有很多放置在屏幕上的隨機對象。我將如何能夠拯救我的狀態這麼多項目?我應該只是打電話完成()並告訴用戶從頭開始? –

+0

如果我暫停我的遊戲暫停按鈕,讓我的手機自動鎖定,恢復所有作品! –

+0

使用共享偏好進行保存。如果你有一個對象數組,我會把它變成一個JSONObject並保存爲字符串。 –