【问题标题】:Android Gameloop: End Game and start ActivityAndroid Gameloop:结束游戏并开始活动
【发布时间】: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(); 之后它会冻结。

我尝试了很多,但没有任何效果。 之前谢谢你的帮助

【问题讨论】:

    标签: java android multithreading surfaceview game-loop


    【解决方案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();
    

    不漂亮,但它有效!

    打个招呼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多