2016-06-28 7 views
0

私はゲーム開発に関するこのチュートリアルに従っています。私は私に少し不思議なことをしました。Android SurfaceView現在のスレッドリファレンス

このチュートリアルでは、メインのゲームコンテンツビューを管理するために、Runnableを実装するSurfaceViewを拡張するクラスが作成されています。 、コードは完璧に動作します -

public class GameView extends SurfaceView implements Runnable { 
    Thread gameThread = null; 
    private boolean playing; 

    public TDView(Context context) { 
     super(context); 

     // other game logic 
    } 

    public void pause() { 
     playing = false; 
     try { 
      gameThread.join(); 
     } catch (InterruptedException e) { 
     } 
    } 

    public void resume() { 
     playing = true; 
     gameThread = new Thread(this); 
     gameThread.start(); 
    } 

    @Override 
    public void run() { 
     while (playing) { 
      update(); 
      draw(); 
      control(); 
     } 
    } 
} 

誤解しないでください。

public class MainActivity extends Activity { 

    private GameView gameView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     gameView = new GameView(this); 
     setContentView(gameView); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     gameView.pause(); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     gameView.resume(); 
    } 
} 

をSurfaceViewクラスは以下のように定義される:表面図は、次のように主な活動のコンテンツビューとして設定されていますしかし、私はについて混乱しています。ここで、gameThread変数はどのようにインスタンス化されますか?レジュームメソッド以外に、プロジェクトのどこにもコード行がないことを示すコード行はありません。 GameViewインスタンスの作成時に再開メソッドが呼び出されるのですか、それとも何か不足しているものがありますか?

これは愚かな質問である場合は失礼ですが、私はどのようにこれをGoogleに把握できませんでした。

+0

'gameThread = new Thread(this);'では、Threadのコンストラクタに渡されたRunnableの実装であり、 'gameThread.start()'は上書きされた 'run()'メソッドを実行します。 –

+0

そのコードはresume()にありますが、 GameViewのメソッド。そのメソッドはGameViewインスタンスの作成時に呼び出されますか? – Nirri

+1

ゲームビューが再開されたときに呼び出されます。これは、ビューが表示され、 "アクティブ"なので、ゲームの 'Thread'インスタンスがレンダリングに有効でないときに' SurfaceView'を操作しようとしないようにする必要があります。残りのコードを見ることなく、おそらくアクティビティライフサイクル(例えば、「Activity.onResume」)および/またはゲームを開始/一時停止/再開するためのメニュー項目の間に起こる。 –

答えて

1

pause()アクティビティが再開されない場合は呼び出されません。だからこのアプローチは問題ありません。毎回pause()と呼ばれます。gameThreadはnullではありません。

+0

アクティビティのライフサイクルを調べていたはずです。ありがとう! – Nirri

関連する問題