我正在开发游戏。在玩游戏的同时,如果用户按下设备后退按钮,我必须暂停线程并显示警告框,它确认用户是否真的要退出。如果用户想要退出它只是退出游戏。但是当用户不想退出时出现问题。然后我必须恢复线程。但我不能这样做。以下是我的代码片段..
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
MyGamePanel.thread.setRunning(false);
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setTitle("Exit Alert");
alertDialog.setMessage("Do you really want to exit the Game?");
alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
finish();
return;
} });
alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
MyGamePanel.thread.resume();
MyGamePanel.thread.setRunning(true);
return;
}});
alertDialog.show();
return true;
}
return super.onKeyDown(keyCode, event);
}
以下给出的是线程部分。
@Override
public void run() {
Canvas canvas;
Log.d(TAG, "Starting game loop");
while (running) {
canvas = null;
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
// update game state
this.gamePanel.update();
// render state to the screen
// draws the canvas on the panel
this.gamePanel.render(canvas);
}
} finally {
// in case of an exception the surface is not left in
// an inconsistent state
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}
} // end finally
}
}
update()和render是在MyGamePanel类中编写的两个函数。
我尝试了很多东西,但没有一个正常工作。请帮助我...
答案 0 :(得分:1)
通常你不想使用resume
和suspend
,因为它们会使线程处于不一致状态。做你想做的事情的最好方法是使用信号量:
在某处声明一个布尔值,让您指定游戏是否暂停:
Boolean paused;
在游戏循环中检查此布尔值并等待暂停:
synchronized(paused) {
while(paused) {
wait();
}
}
从主线程设置和取消设置暂停的布尔值:
public void setPaused(boolean wantToPause) {
synchronized(paused) {
paused = wantToPause;
notify();
}
}
这是示意图代码,例如,它不会处理异常,但您会明白这一点。
答案 1 :(得分:0)
我认为您的问题出在MyGamePanel.thread.resume();
。尝试删除该代码,看看会发生什么。
如果您认为thread.resume()是您为不同目的所需的功能(您只能删除它),那么请向我们展示thread.resume()函数代码,以便我们可以尝试帮助您修复简历功能代码。
答案 2 :(得分:-1)
我有同样的问题,但我发现解决方案只是在线程中替换此代码。
while (true) {
if(running){
Log.d("running", "true");
canvas = null;
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
// update game state
this.gamePanel.update();
// render state to the screen
// draws the canvas on the panel
this.gamePanel.render(canvas);
}
} finally {
// in case of an exception the surface is not left in
// an inconsistent state
if (canvas != null) {
surfaceHolder.unlockCanvasAndPost(canvas);
}`enter code here`
} // end finally
}
}