ざっくり確認してみた
Beginning Android Game Programming なソレの中身を確認してみます。
- AndroidTutorialActivity
- Activity を継承
- setContentView に AndroidTutorialPanel なオブジェクトを渡している
- AndroidTutorialPanel クラスは内部クラスで DrawablePanel を継承している
- AnimatedSprite 型な属性保持
- DrawablePanel
えと、SurfaceView とか SurfaceHolder とかって何なのかが若干微妙
SurfaceView
使ってるケイスなナニを漁ってみたんですが、なんとなく慣用句的な使い方として
- Activity では onCreate の中の setContentView に SurfaceView を継承してて、SurfaceHolder.Callback と Runnable を実装したオブジェクトを生成して渡す
- SurfaceView のサブクラスにて
- surfaceCreated (Surface が作られた) 時に Thread を生成してキック
- これ、コンストラクタでヤッてるケイスもあります
- surfaceDestroyed Thread をコロしている
- コンストラクタで Thread 生成する場合は、onDestroy でナニ。
- これ、onStop とかの方が良さげですが
- run の中で
- 描画の開始が getHolder().lockCanvas
- しかもこのメソドが Canvas なオブジェクトを戻している模様
- 描画の終了が getHolder().unlockCanvasAndPost
- 上記メソドに開始時に取得して Canvas なオブジェクトを渡す?
というあたりの理解で
再度確認してみます。てーか、これは非常に面白いツクリになっておりますな。AnimatedSprite 以外は基本的にそのまんまで流用できるのかな。
基本的には
- Activity を継承してるクラス (この例では AndroidTutorial) では onCreate の定義と setCOntentView に渡す内部クラス (この例では AndroidTutorialPanel) の定義をしている
- AndroidTutorialPanel は DrawablePanel を継承
- 記述しているのはコンストラクタと ISurface なメソドのみ
- ISurface なメソドでは AnimateSprite なインタンスメソドを呼び出しているのみ
- DrawablePanel は SurfaceView 継承して SurfaceHolder.Callback と ISurface を実装
- thread は別でもってます。private な AnimationThread 型の属性
- 最低限の必要な事をしているのみ (サンプルだから当たり前っちゃ当たり前
- AnimationThread は Thread 継承
- run の中で Canvas の lock/unlock している
- 実際の描画は ISurface#onDraw
- AnimatedSprite で実際の描画を行なっております
これはなかなか面白い。丸を飛ばすサンプルみたいのがあったはずなので、別途この方式で書き換えてみましょうね。