Java Android Gameloop:结束游戏并开始活动
我的Android项目(我的第一个Android项目)中的GameLoop有问题: 我有一个GameView(SurfaceView)启动的活动 GameView(SurfaceView)启动游戏线程Java Android Gameloop:结束游戏并开始活动,java,android,multithreading,surfaceview,game-loop,Java,Android,Multithreading,Surfaceview,Game Loop,我的Android项目(我的第一个Android项目)中的GameLoop有问题: 我有一个GameView(SurfaceView)启动的活动 GameView(SurfaceView)启动游戏线程 public void surfaceCreated(SurfaceHolder holder) { Log.d("GameView", "surfaceCreate"); surfaceHolder = holder; synchronized (this) {
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);
}
}
}
}
现在我可以玩了。到目前为止,一切都很好
如果玩家丢失了一个新的活动(GameOver),游戏线程将停止。
他在这里撞车了
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()之后代码>它冻结
我试了很多,但都没用。
感谢您之前的帮助我认为问题在于您使用了两个同步块,一个用于渲染
(在gameLoop中),另一个用于结束它。第二个街区必须等待
第一个停止执行,这是永远不会,因此游戏冻结
请尝试从第二段中删除“synchronized(surfaceHolder)”语句
您发布的代码。我没有找到确切的错误
相反,我对代码进行了一些转换
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();
不漂亮,但它的工作
走开谢谢你的回答。我使用了你的想法,但它出现了与bevorher相同的现象。你能在gameLoop.join()冻结之前打印gameLoop.running的值吗?它的价值是什么?您还可以在游戏线程循环中打印它吗?gameLoop.runnig的值位于endgame()true的开头。@Ebrahim如果删除synchronize关键字,您需要使running变为volatile,否则游戏循环可能永远看不到更新的值。
((_1GameActivity)getContext()).finish();