Android携帯ゲームを作って世界に配信してみよう(2) ―― ゲームの基本構造とタップやフリックの処理を学ぶ
3.高速描画やゲーム・ループ用のスレッドの生成/破棄について
それでは,今回用いたソース・コードの中から,ゲームを開発するにあたって重要な部分について説明していきます.
●SurfaceViewを用いて高速描画処理を行う
今回は画面を管理するクラスとして,Viewのコンテンツ・エリアを自前で描画する場合に最適な「SurfaceView」というクラスを利用しています(リスト1).前回はViewクラスのonDrawメソッドをオーバライドして描画しましたが,SurfaceViewクラスを使うと,それよりも高速に処理することができます.詳しくは,Google社が提供している下記のAPIドキュメントをお読みください.
http://developer.android.com/reference/android/view/SurfaceView.html
リスト1 GameView.java(com.spicysoft.android.framwork内に存在)のコードの一部

onKeyDownやonTouchEventなどといったViewのイベントとは別に,SurfaceViewでは表1に示す3種類のイベントが発生します.SurfaceHolder.Callbackインターフェースを実装してリスナとして登録すれば,これらのイベントを受信することができます.
表1 SurfaceView独自のイベント

●ゲーム・ループ専用のスレッドの生成と破棄の処理
ゲームは,フレームという単位で,入力処理やオブジェクトの移動などの描画処理を行います.ゲームを滑らかに動作させるには,1秒あたり数十回のフレームが処理される必要があります.専用のスレッドを作成して,その中でループを回しながら高速に処理を行います.このゲーム・ループにて,ゲームに必要な(1)タッチやフリックなどの入力処理やゲーム内のオブジェクトの移動処理,(2)画面への描画処理,(3)一定の秒間フレーム数(フレーム・レート)で処理が行われるような同期処理といったすべての処理を行います(ほかの場所では,入力やオブジェクトの処理,描画を行わない).
ゲーム・ループの生成と破棄の流れについて解説します.GameViewクラス(GameView.java)のsurfaceCreatedメソッドを見てください(リスト2の(a)).画面(Surface)が生成されたタイミングで,ゲーム・ループ用の処理スレッドを生成して開始します.
リスト2 SurfaceViewクラスの3種類のイベント(GameView.javaより抜粋)
surfaceCreatedメソッドでゲーム・ループ用の処理スレッドを生成している.また,surfaceDestroyedメソッドで処理スレッドを中断している.

続いて,その下にあるsurfaceDestroyedメソッドを見てください(リスト2の(b)).ゲームが終わり,画面(Surface)が破棄されるタイミングで,処理スレッドの中断処理を行います.