ざっくり確認してみた

Beginning Android Game Programming なソレの中身を確認してみます。

  • AndroidTutorialActivity
    • Activity を継承
    • setContentView に AndroidTutorialPanel なオブジェクトを渡している
    • AndroidTutorialPanel クラスは内部クラスで DrawablePanel を継承している
    • AnimatedSprite 型な属性保持
  • DrawablePanel
    • android.view.SurfaceView を継承
    • android.view.SurfaceHolder.Callback および ISurface インターフェースを実装
    • AnimationThread 型の private な属性を持っている

えと、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 で実際の描画を行なっております

これはなかなか面白い。丸を飛ばすサンプルみたいのがあったはずなので、別途この方式で書き換えてみましょうね。