我的Android projekt(我的第一个Android项目)中的GameLoop存在问题:
我有一个GameView(SurfaceView)启动的活动。
setContentView(new GameView(this));
GameView(SurfaceView)启动GameThread。
public void surfaceCreated(SurfaceHolder holder) {
Log.d("GameView", "surfaceCreate");
surfaceHolder = holder;
synchronized (this) { //Must be executed exclusively
if (gameLoop == null) {
gameLoop = new GameLoop(); //Start animation here
gameLoop.start();
}
}
}
private class GameLoop extends Thread {
public boolean running = true;
public void run() {
Canvas canvas = null;
final SurfaceHolder surfaceHolder = GameView.this.surfaceHolder;
while (running) {
try {
canvas = surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
update();
checkCollision();
render(canvas);
}
} finally {
if (canvas != null)
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
}
}
现在我可以玩了。到目前为止,一切都很好。
如果玩家失去了一个新的Activity(GameOver),并且GameThread停止了。 他在这里崩溃了!
public void endgame() {
Log.d("GameView", "ENDGAME");
this.score.setStopscoring(true);
this.box.stop();
synchronized (surfaceHolder) {
boolean retry = true;
if (gameLoop != null) {
gameLoop.running = false;
while (retry) {
try {
gameLoop.join();
retry = false;
} catch (Exception e) {
}
}
}
}
Context context = getContext();
context.startActivity(new Intent(context, _1GameOver.class));
}
结束gameLoop.join();
冻结。
我已经尝试了很多,但没有任何效果。 谢谢你的帮助
答案 0 :(得分:0)
我认为问题在于您使用了两个同步块,一个用于渲染 (在gameLoop中),另一个结束它。第二块必须等待 第一个停止执行,这是永远不会,因此游戏冻结。
尝试从第二部分删除“synchronized(surfaceHolder)”语句 您发布的代码。
答案 1 :(得分:0)
我没有找到确切的错误。
相反,我转换了一些代码。
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
if (gameLoop != null) {
gameLoop.running = false;
while (retry) {
try {
gameLoop.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
gameLoop = null;
}
我结束活动的所有内容。
((_1GameActivity)getContext()).finish();
不漂亮,但它有效!
Pease out