Android Gameloop:结束游戏并开始活动
Posted
技术标签:
【中文标题】Android Gameloop:结束游戏并开始活动【英文标题】:Android Gameloop: End Game and start Activity 【发布时间】:2012-07-04 09:26:21 【问题描述】:我的 android 项目(我的第一个 Android 项目)中的 GameLoop 有问题:
我有一个 GameView (SurfaceView) 启动的 Activity。
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();
之后它会冻结。
我尝试了很多,但没有任何效果。 之前谢谢你的帮助
【问题讨论】:
【参考方案1】:我认为问题在于您使用了两个同步块,一个用于渲染 (在gameLoop内),另一个结束它。第二块必须等待 第一个停止执行,这永远不会,因此游戏冻结。
尝试从第二部分中删除“ synchronized (surfaceHolder) ”语句 您发布的代码。
【讨论】:
感谢您的回答。我使用了你的想法,但它发生了与bevorher相同的现象。 你能在 gameLoop.running 在 gameLoop.join() 冻结之前打印它的值吗?它的价值是什么?你也可以在游戏线程循环中打印它吗? gameLoop.runnig 的值在 endgame() 的开头为真。 @Ebrahim 如果你去掉 synchronize 关键字,你需要让运行 volatile 或者游戏循环可能永远看不到更新的值。【参考方案2】:我没有找到确切的错误。
相反,我稍微转换了代码。
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;
以及我在关闭 Activity 时得出的所有结论。
((_1GameActivity)getContext()).finish();
不漂亮,但它有效!
打个招呼
【讨论】:
以上是关于Android Gameloop:结束游戏并开始活动的主要内容,如果未能解决你的问题,请参考以下文章