2012-01-17 98 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