2012-01-17 97 views
0

我正在開發基於此tutorial的遊戲。 我設法使遊戲的大部分工作,但是當用戶按下home按鈕時,我的遊戲繼續在後臺運行,我可以使用onPause方法暫停它,除了它之外的所有東西都不會運行onResume方法。按下主屏幕按鈕後失去對SurfaceView的注意力

當用戶重新開始遊戲時,沒有任何方法被調用,並且我的面板失去了焦點。

在按下主頁按鈕後,如何讓遊戲在發送到後臺後再次獲得焦點?

我的活動代碼:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    panel = new Panel(this); 
    // requesting to turn the title OFF 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    // making it full screen   
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    // set our MainGamePanel as the View 
    setContentView(panel); 
    Log.d(TAG, "onCreate"); 
} 



    @Override 
public void onStart(){ 
    super.onStart(); 
    Log.d(TAG,"onStart"); 
} 

@Override 
public void onRestart(){ 
    super.onRestart(); 
    Log.d(TAG,"onRestart"); 

} 
@Override 
public void onResume(){  
    super.onResume(); 
    Log.d(TAG, "onResume");   
} 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    Log.d(TAG, "onSaveInstance");  
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    Log.d(TAG, "onRestoreInstance");  
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    Log.d(TAG,"onpause");  
} 


@Override 
public void onStop() { 
    super.onStop(); 
    Log.d(TAG, "onStop.."); 
} 


@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.d(TAG, "onDestroy..."); 
} 

我的面板構造:

WhackEmPanel(Context c) { 
    super(c); 
    this.context=c; 
    loadAnimations(); 
    setCharacters(); 
    getHolder().addCallback(this); 
    backGround = BitmapFactory.decodeResource(getResources(), R.drawable.background); 
    // create the game loop thread 
    thread = new MainThread(getHolder(),this); 
    setFocusable(true);  
    //Generate Random Numbers for characters 
    Picker = RandomPicker.RandomPick(8,500); //From 0 to 8, gives me 500 random integers 
    picked=Picker.remove(0); 
} 

我是新來這個遊戲節目的事情,但據我瞭解,我需要調用setFocusable(真)再次,但在哪裏?

編輯:從DizzyThermal的建議後,我刪除了暫停方法,只留下日誌,我不明白爲什麼它永遠不會到達onResume()方法!

回答

1

我找到了解決方案。當home按鈕被按下時,我的gameloop Thread仍在運行,onStop從未被調用過,我猜測這個活動從未正確停止過。現在我的onPause方法實際上完成了線程執行,並且遇到了Lunar Lander示例bug。

Blog幫助我通過添加以下代碼到我的面創造者解決的bug:

public void surfaceCreated(SurfaceHolder holder) { 

    Log.d(TAG, "surfaceCreated"); 
\\ <-- added fix 
    if(thread.getState()== Thread.State.TERMINATED){ 
     thread = new MainThread(getHolder(),this); 
     thread.setRunning(true); 
      thread.start(); 
// <-- added fix 
    }else { 
    thread.setRunning(true); //original code 
    thread.start();   //original code 
    } 
} 

我的onPause方法現在實際上停止遊戲線程執行。

public void onPause(){ 
    super.onPause(); 
    panel.stopPLaying(); 
    Log.d(TAG,"onpause");  
} 
0

代替把的onResume()方法保護,儘量使其公共 ..

此外,嘗試移動super.onResume();到方法的頂部。我敢肯定,它需要成爲「Overriden」功能中所稱的第一件事。

+0

不..它沒有幫助。它仍然沒有達到onResume或其他任何Overriden方法。我已經編輯了我現在的代碼的答案。 – caiocpricci2 2012-01-18 14:36:01

+0

您仍然有'panel.pauseGame(false);''super.onResume();'之前''Android活動生命週期應該達到onPause()當Home被擊中時(可能更遠取決於您在返回之前等待多久)以及何時帶回它必須通過onResume()繼續運行..包含super.onResume()方法做它通常會做的事情..這是它會做什麼,如果你不覆蓋它。這就是爲什麼它通常作爲第一件事情被包括在內。 – DizzyThermal 2012-01-18 20:44:30

+0

它仍然不會改變任何事情,無論是否有暫停遊戲,日誌仍然不會給我onResume,onRestart,onStart,什麼都沒有。回家後回來後,沒有任何方法被調用。我不明白爲什麼。 – caiocpricci2 2012-01-19 00:13:56