私はゲームを作っています。私はAndroidを初めて使っているので、例LunarLander codeのデザインに基づいています。その設計において、GameThread.doStart()
はGameActivity
から呼び出され、(コードの多くは、明確にするために取り除かれている)以下に示すように、スレッドは、そのGameThread.run()
ループからすべてを実行する:SurfaceHolder.lockCanvas()nullを返します
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();
}
}
}
を。私はlockCanvas()
は常にnullを返しますので、私は、画面には何も描くことができないことを行う場合を除き
class GameThread extends Thread
{
public void doStart()
{
}
public void run()
{
Canvas c = null;
try
{
c = mSurfaceHolder.lockCanvas();
// Use canvas
}
finally
{
}
}
}
。私が言ったように、私はまだAndroidには新しいので、なぜ2番目のケースが機能していないのかわかりません。誰が何が起こっているのか、なぜうまくいかないのかを知っていますか?
EDIT:私がテストしたところから、表面は決して作られません。 GameView.onResume()
の間、私は、ゲームで移動する前に表面が作成されるのを待っていましたが、それは永遠に待っていました。最初のインスタンスは、サーフェスが作成される唯一のケースです。
は何を示唆していると、私はすでにやっているものです。私はちょうどそのコードを表示しませんでした。あなたが望むなら、私はそれを追加します。 –
私は、アクティビティの一時停止時にスレッドをシャットダウンしません。スレッドループがメソッドを呼び出さないようにブール値フラグを設定するだけです。再開すると、このフラグが再びリセットされ、アニメーションは続行されます。サーフェスが破棄された場合、surfaceCreatedは次回に新しいスレッドを作成します。 – Lumis
サーフェスが作成されていない場合は、これを検出してアクティビティを再開できます。 – Lumis