6

私はゲームを作成していますが、Androidを初めて使用するため、LunarLanderコードの例に基づいてデザインを作成しました。その設計でGameThread.doStart()は、はから呼び出されGameActivity、スレッドは次にGameThread.run()示すようにループからすべてを実行します(わかりやすくするためにコードの多くは削除されています)。

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();
        gameThread.doStart();
    }
}

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        while (running)
        {
            Canvas c = null;
            try
            {
                c = mSurfaceHolder.lockCanvas();
                // Use canvas
            }
            finally
            {
            }
        }
    }
}

私が遭遇したいくつかの問題を修正するために、以下に示すように、GameActivityの手にもっと制御を入れようとしました:

public class GameActivity extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        gameView = new GameView(this);
        fl = new FrameLayout(this);
        fl.addView(gameView);

        setContentView(fl);

        gameThread = gameView.getThread();

        while (gameThread.isRunning())
        {
            gameThread.run();
        }
    }
}

class GameThread extends Thread
{
    public void doStart()
    {
    }

    public void run()
    {
        Canvas c = null;
        try
        {
            c = mSurfaceHolder.lockCanvas();
            // Use canvas
        }
        finally
        {
        }
    }
}

それを行う場合を除いて、lockCanvas()常にnullが返されるため、画面に何も描画できません。私が言ったように、私はまだAndroidに慣れていないので、2番目のケースが機能しない理由がわかりません。何が起こっているのか、なぜそれが機能しないのか誰もが知っていますか?

編集:私がテストしたものから、表面は決して作成されません。アクティビティの間GameView.onResume()、サーフェスが作成されるのを待ってからゲームを続行しましたが、それは永遠に待ちました。なぜ最初のインスタンスがサーフェスが作成される唯一のケースなのですか?

4

2 に答える 2

3

作成時にthredinアクティビティを開始しますが、SurfaceViewが作成されて準備ができたときにのみ開始する必要があります。これを2番目のSurfaceViewの例で確認してください:キャンバス内でアニメーションフレームワークを使用するにはどうすればよいですか?

于 2011-08-03T09:54:55.770 に答える
0

サーフェスが作成されたら、スレッドの実行を開始します。つまり、コールバックsurfaceCreated()を取得したら、スレッドを開始します。

コードスニペット

public void surfaceCreated(SurfaceHolder holder) {
    thread.setRunning(true);
    thread.start();
}

シャッシュ

于 2011-08-03T18:07:14.640 に答える