私はゲームを作成していますが、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()
、サーフェスが作成されるのを待ってからゲームを続行しましたが、それは永遠に待ちました。なぜ最初のインスタンスがサーフェスが作成される唯一のケースなのですか?