我正在开发一款基于此tutorial的游戏。 我设法使游戏的大部分工作,但当用户按下主页按钮时,我的游戏在后台继续运行,我可以使用onPause方法暂停它,除了它之外的所有东西都不会运行onResume方法。
当用户重新启动游戏时,没有调用任何方法,并且我的面板失去了焦点。
在按下主页按钮后将游戏发送到后台后,如何让它再次获得焦点?
我的活动代码:
@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(true),但在哪里?
编辑:在DizzyThermal的建议之后,我删除了暂停方法,只留下了日志,我不明白为什么它永远不会到达onResume()方法!答案 0 :(得分:1)
我找到了解决方案。当按下主页按钮时,我的游戏循环线程仍然在运行,onStop从未被调用,我猜这个活动从未被正确停止过。现在我的onPause方法实际上完成了Thread执行,我遇到了Lunar Lander示例bug。
这个Blog通过向我的表面创建者添加以下代码帮助我解决了这个问题:
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");
}
答案 1 :(得分:0)
不要将 onResume()方法保护,而是将其设为公开 ..
另外,尝试将super.onResume();
移动到方法的顶部..我很确定它必须是“ Overriden ”函数中调用的第一个东西。