Java 在游戏中退出时造成的强制关闭
我尝试了很多方法来解决这个问题。最新的是使home按钮和back按钮执行onDestroy();并完成() 基本上,当我在游戏中退出游戏时,它就会退出(声音还会继续播放几分钟,不知道该怎么办)。但当我点击重新进入游戏时,一个强制关闭弹出。单击后,它将再次工作。但我想让它在退出游戏时,它摧毁一切,使它成为一个全新的游戏。或者,如果能阻止游戏以这种方式强行关闭,那么当主打或后卫被击中时暂停游戏也可以。我尝试将返回和主页按钮指定为暂停,并尝试了onDestroy();并完成();还有它 使用的代码如下所示:Java 在游戏中退出时造成的强制关闭,java,android,Java,Android,我尝试了很多方法来解决这个问题。最新的是使home按钮和back按钮执行onDestroy();并完成() 基本上,当我在游戏中退出游戏时,它就会退出(声音还会继续播放几分钟,不知道该怎么办)。但当我点击重新进入游戏时,一个强制关闭弹出。单击后,它将再次工作。但我想让它在退出游戏时,它摧毁一切,使它成为一个全新的游戏。或者,如果能阻止游戏以这种方式强行关闭,那么当主打或后卫被击中时暂停游戏也可以。我尝试将返回和主页按钮指定为暂停,并尝试了onDestroy();并完成();还有它 使用的代码如下
if(keyCode == onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK){
onDestroy();
finish();
}
return super.onKeyDown(keyCode, event);
}
我是从一本书上抄的。我也换了钥匙回到家里,两个似乎都不起作用
我还尝试使用onDestroy();并完成();试图在游戏结束后重新设置游戏,但这不起作用。顺便说一句,所有这些都必须在调用surfaceview的类中进行编码,因为它在surfaceview中不起作用
如有任何帮助,我们将不胜感激。谢谢
编辑
//若(完){
//onDestroy();
//完成();
// }
}
}
这就是代码中的样子。老实说,我在编程方面是垃圾,所以我真的不使用debug,因为它让我很困惑,所以我不知道如何找到您要求的异常。是的,我意识到如果有人这么想的话,我需要学会使用debug
还有,如果有人对如何让我的静音设备工作有任何意见。我试过了,但没用
public class PlayGame extends Activity{
private static long pauseStartTime;
boolean mute=false;
GameView gameView;
Main main;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new GameView(this));
mute = main.mute;
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.newgame:
Intent game = new Intent(PlayGame.this, Main.class);
startActivity(game);
break;
case R.id.pause:
if(GameView.gameState == 0){
GameView.gameState=2;
pauseStartTime = System.currentTimeMillis();
}
else if (GameView.gameState == 2){
GameView.gameState=0;
long deltaTime = System.currentTimeMillis()-pauseStartTime;
GameView.spawnZom1Time+=deltaTime;
GameView.spawnZom2Time+=deltaTime;
GameView.spawnZom3Time+=deltaTime;
GameView.spawnSurvTime+=deltaTime;
}
break;
case R.id.mute:
if (mute || main.mute){
mute = false;
Toast.makeText(this, "Game Unmuted", Toast.LENGTH_LONG).show();
}
else if (mute == false || main.mute == false){
mute = true;
Toast.makeText(this, "Game Muted", Toast.LENGTH_LONG).show();
}
break;
}
return true;
}
}您正在调用
onDestroy()
两次,一次显式调用,另一次使用finish()间接调用代码>
从方法中删除该行:
if(keyCode == onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK){
finish();
}
return super.onKeyDown(keyCode, event);
}
请看一下:
onDestroy()
在活动被销毁之前调用。这是活动将收到的最后一个呼叫。调用它可能是因为活动正在完成(有人对其调用finish()),也可能是因为系统正在临时销毁活动的此实例以节省空间。可以使用isFinishing()方法区分这两种情况
现在,重读一遍,我对什么时候有例外感到困惑:是退出(如标题所示)还是重新加载(如文本所示)
在任何情况下,我强烈建议您停止编码,并花时间阅读以下内容:请粘贴您得到的异常和准确的代码。粘贴的内容不会编译。嗯,好吧,您不应该直接调用onDestroy()、onPause()等。它们是Android的系统回调。很可能您正在onCreate中初始化一些重要变量。将变量初始化移动到onResume或onStart。放入代码和异常。。否则它将是猜测。。。
public class PlayGame extends Activity{
private static long pauseStartTime;
boolean mute=false;
GameView gameView;
Main main;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(new GameView(this));
mute = main.mute;
}
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.newgame:
Intent game = new Intent(PlayGame.this, Main.class);
startActivity(game);
break;
case R.id.pause:
if(GameView.gameState == 0){
GameView.gameState=2;
pauseStartTime = System.currentTimeMillis();
}
else if (GameView.gameState == 2){
GameView.gameState=0;
long deltaTime = System.currentTimeMillis()-pauseStartTime;
GameView.spawnZom1Time+=deltaTime;
GameView.spawnZom2Time+=deltaTime;
GameView.spawnZom3Time+=deltaTime;
GameView.spawnSurvTime+=deltaTime;
}
break;
case R.id.mute:
if (mute || main.mute){
mute = false;
Toast.makeText(this, "Game Unmuted", Toast.LENGTH_LONG).show();
}
else if (mute == false || main.mute == false){
mute = true;
Toast.makeText(this, "Game Muted", Toast.LENGTH_LONG).show();
}
break;
}
return true;
}
if(keyCode == onKeyDown(int keyCode, KeyEvent event){
if (keyCode == KeyEvent.KEYCODE_BACK){
finish();
}
return super.onKeyDown(keyCode, event);
}