Android Gameloop:结束游戏并开始活动

时间:2012-07-04 09:26:21

标签: java android multithreading surfaceview game-loop

我的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();冻结。

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

2 个答案:

答案 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