ホームへ戻る

s2.1 ゲームの骨格を作る


 昔TV番組で「電流イライラ棒」が流行りましたよね。
・・・って15年も前の番組ですから今の人は知らないんですかね。。。
まぁそんなことは良しとして、接触してはいけない壁に囲まれた迷路の中を進んで行くようなゲームを作ってみたいと思います。
今回サンプルを紹介する前にサクッと作ってみました。
こんな感じにしようと思います。(きっと仕様は若干異なると思いますが)



黒は接触してもOKな壁、赤は接触するとアウトな壁。
自分は青円で、ゴールは緑の四角です。
端末の加速度センサーを使って、端末を傾けて迷路を進みます。

実際に自分の端末で遊んでみたい方はこちらにありますのでどうぞ。
(マーケット以外からインストールする時は、「設定」>「アプリ」>「提供元不明のアプリ」にチェックを入れて下さい)
なお、戻るボタンを押すとリトライ出来ます。

壁に当たって跳ね返る処理は少々面倒なので、今回は全部赤い壁にしようと思います。


前置きはこれ位にして、実際に作っていきましょう。

まず、「IrairaBar」という名前でプロジェクトを作って下さい。
本アプリはSurfaceViewを使って実装します。
そこで、SurfaceViewを継承した自前Viewである「GameSurfaceView」を作ろうと思いますので、
クラスに「GameSurfaceView」を追加して下さい。



以下、ソースコードを紹介します。

↓IrairaBarActivity.java

public class IrairaBarActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                setContentView( new GameSurfaceView(this) );
    }
}


↓GameSurfaceView.java

class GameSurfaceView extends SurfaceView implements SurfaceHolder.Callback, Runnable {
        Thread _thread;

        public GameSurfaceView(Context context) {
                super(context);
                getHolder().addCallback(this);
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                //解像度情報変更通知 
        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
                _thread = new Thread(this);             //別スレッドでメインループを作る
                _thread.start();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
                _thread = null;
        }

        @Override
        public void run() {
                while (_thread!=null) { //メインループ
                        onDraw(getHolder());
                }
        }

        private void onDraw(SurfaceHolder holder) {
                Canvas c = holder.lockCanvas();
                if(c == null){
                              return;
                }
                //ここにゲームの描画処理を書く
                holder.unlockCanvasAndPost(c);
        }
}


例によって必要なimportは「Ctrl+Shift+O」で追加して下さい。

さて、これがゲーム制作で必要な最小限の構成です。
Activity部は簡単ですね。
単に自作Viewをセットしているだけです。
ゲーム作りにおいては、Activityさんにはあまり活躍してもらいません。
ほとんどSurfaceView以下で処理を行います。

SurfaceViewの良い所は、他のViewでは出来ない「自分専用のスレッドで描画できる」という点です。
描画するタイミングがマチマチではゲームになりません。
今回は自分専用のスレッドを立てて、グルグルループで処理を回してやろうと思います。

そこで必要な処理を紹介します。
SurfaceViewを継承した自前ViewであるGameSurfaceViewにSurfaceHolder.CallbackとRunnableを実装しています。


●SurfaceHolder.Callback
これは、サーフェスが生成された、破棄された等のイベントをコールバックしてくれるインターフェイスです。上で実装している
void surfaceCreated() で生成されたことが、
void surfaceDestroyed() で破棄されたこと等が分かるようになっています。

●Runnable
これは他の章でも解説している通り、別スレッドで処理をする為に必要なインターフェイスです。
実際に別スレッドで処理をする内容はvoid run() に記載することになります。


前述の通り、
ゲームのメインループはこのrun内のwhile文となります。(上のコードを確認して下さい)
一つ気を付けないといけないのは、onDraw内の処理です。
SurfaceHolderを使って、キャンバスをロックしてから、書き込み、
書き込みが終わったらロックを外す処理をしなければなりません。

その為、実際の描画処理は onDraw() 内の「//ここにゲームの描画処理を書く」と書いている部分になります。

さて、一応このままで実行できるので実行してみて下さい。
・・とはいえ、何も具体的な処理を書いていないので、真っ黒の画面が出るだけです。

この章のプロジェクトをダウンロード

→分からないことがあれば掲示板で質問して下さい


Portions of this page are modifications based on work created and shared by Google and used according to terms described in the Creative Commons 3.0 Attribution License.

- Remical Soft -