0

Androidプロジェクト(最初の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);
            }
        }
    }

}

そして今、私は遊ぶことができます。この時点まで、すべてがOKです。

プレーヤーが新しいアクティビティ(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

問題は、同期された2つのブロックを使用していることだと思います。1つは(gameLoop内で)レンダリングするためのもので、もう1つはそれを終了するためのものです。2番目のブロックは、最初のブロックの実行が停止するのを待つ必要がありますが、これは決して行われないため、ゲームはフリーズします。

投稿した2番目のコードから「synchronized(surfaceHolder)」ステートメントを削除してみてください。

于 2012-07-04T13:52:07.570 に答える
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 に答える