2011-08-03 7 views
4

私はゲームを作っています。私は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()の間、私は、ゲームで移動する前に表面が作成されるのを待っていましたが、それは永遠に待っていました。最初のインスタンスは、サーフェスが作成される唯一のケースです。

答えて

2

作成時にアクティビティでthredを開始していますが、SurfaceViewが作成され、準備が整ったときにのみ起動する必要があります。 2番目のSurfaceViewの例を確認してください:How can I use the animation framework inside the canvas?

+0

は何を示唆していると、私はすでにやっているものです。私はちょうどそのコードを表示しませんでした。あなたが望むなら、私はそれを追加します。 –

+0

私は、アクティビティの一時停止時にスレッドをシャットダウンしません。スレッドループがメソッドを呼び出さないようにブール値フラグを設定するだけです。再開すると、このフラグが再びリセットされ、アニメーションは続行されます。サーフェスが破棄された場合、surfaceCreatedは次回に新しいスレッドを作成します。 – Lumis

+0

サーフェスが作成されていない場合は、これを検出してアクティビティを再開できます。 – Lumis

1

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

コードスニペット

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

Shash

+0

これは、やって –

関連する問題