私はゲーム開発に関するこのチュートリアルに従っています。私は私に少し不思議なことをしました。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に把握できませんでした。
'gameThread = new Thread(this);'では、Threadのコンストラクタに渡されたRunnableの実装であり、 'gameThread.start()'は上書きされた 'run()'メソッドを実行します。 –
そのコードはresume()にありますが、 GameViewのメソッド。そのメソッドはGameViewインスタンスの作成時に呼び出されますか? – Nirri
ゲームビューが再開されたときに呼び出されます。これは、ビューが表示され、 "アクティブ"なので、ゲームの 'Thread'インスタンスがレンダリングに有効でないときに' SurfaceView'を操作しようとしないようにする必要があります。残りのコードを見ることなく、おそらくアクティビティライフサイクル(例えば、「Activity.onResume」)および/またはゲームを開始/一時停止/再開するためのメニュー項目の間に起こる。 –