0

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

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

4

2 回答 2

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();

不漂亮,但它有效!

消遣

于 2012-07-09T08:51:46.273 回答
0

我认为问题在于您正在使用两个同步块,一个用于渲染(在游戏循环中),另一个用于结束它。第二个块必须等待第一个块停止执行,这永远不会,因此游戏冻结。

尝试从您发布的第二段代码中删除“synchronized (surfaceHolder)”语句。

于 2012-07-04T13:52:07.570 回答