ゲームの演出

2011年5月27日(金)
北村 真二

ゲームクリアの条件作成

前回はウサギがオオカミに攻撃されてゲームオーバーするまでの流れを作成した。今回はまずゲームクリアに至る流れを作成してみよう。

「Rabbit Maze」のゲームクリアの条件はマップに置かれたニンジンを全て回収することだ。それではまずニンジンをマップに配置してみよう。ニンジンもウサギやオオカミと同じくGamePieceViewとして配置する。GamePieceView.h のタイプ定義に「ニンジン」を追加し、プロジェクトに「ニンジン」の画像も追加しておく。ニンジンは置かれてるだけなので1パターンで十分だ。

1//タイプ
2  typedef enum{
3  TYPE_RABBIT       =0,     //ウサギ
4  TYPE_WLOF         =1,     //オオカミ
5   
6  TYPE_CARROT       =2,     //ニンジン
7  } PieceType;

ウサギやオオカミと同じように必要な数だけマップに配置する。取りあえず3つ配置することにしよう。以下のコードでひとまずニンジンがマップに3つ配置される。

01int tileIndex[3] = {10, 55, 66};
02for (int i=0; i < 3; i++) {
03    UIImage*    image = [UIImage imageNamed:@"carot_00.png"];
04    NSMutableArray* array = [NSArray arrayWithObject:image];
05    GamePieceView*  carot = ;
06    tile.item = carot;
07    carot.tile = tile;
08    carot.center = [tile center];
09    carot.state = STATE_STAY;
10}

図1:ニンジンの配置されたマップ

これだけではニンジンがマップに置かれただけの状態なので、まだ取ることはできない。次はウサギがニンジンを取るためのコーディングを行う。

ウサギがニンジンと同じマス目に乗ればニンジンを取ったことにする、そのためには同じマス目にウサギとニンジンが重なる必要がある。今までは同じマス目にウサギとオオカミが重ならないように、マス目を表すクラスであるGameBoardTileにpieceというプロパティーを持たせ、その上に現在いるキャラクターを記録して、複数のキャラクターがかぶらないようにしていた。

そこでGameBoardTileに新たにitemというプロパティーを追加する。配置されているニンジンをitemプロパティーに記録するようにして、キャラクターがいるかどうかのチェックにはpieceを、ニンジンが置かれているかどうかをチェックするにはitemを参照するようにする。

ニンジンの取得チェック

ニンジンを取ったかどうかを判定する場所は1マス移動した後の移動のアニメーション終了時、GamePieceViewに実装してあるCore Animation終了通知のデリゲートメソッド animationDidStop:finished: だ。ニンジンの置いてあるマス目を通過、または停止した場合にニンジンを取ったと見なす。

01- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
02    {
03    ~略~
04    //移動中
05    if( state==STATE_MOVEING ){
06        GamePieceView*  carot = (GamePieceView*)nextTile.item;
07        if( carot && carot.type==TYPE_CARROT){
08            //ニンジンを取った
09            carot.state = STATE_DEAD; // ステータスを死亡にする
10        }
11        ~略~
12    }
13   
14}

ニンジンを取った後の処理はどうするかというと、ニンジンのステータスプロパティーを「死亡」にする。これでウサギと同じアニメーションで消えて行ってくれる。ただ、ステータス設定時の画像設定と、死亡アニメーション終了後に呼ばれるデリゲートメソッド内での削除処理を少しニンジン用に変更する必要がある。

ニンジンに画像が1つしか無いので、死亡時でも同じ番号のものを使用するのと、アニメーション終了後には以下のデリゲートメソッドでビューを削除するようにしておく。そしてニンジンの数をプロパティーに設定しておき、残り数が0になったらゲームクリアの判定処理を行うようにする。

01//死亡通知
02-(void)gamePieceDead:(GamePieceView*)piece {
03    //ウサギが死亡
04    if( piece == pieceView ){
05        //削除
06        pieceView.tile.piece = nil;
07        [pieceView timerStop];
08        [pieceView removeFromSuperview];
09        [pieceView release];
10        pieceView = nil;
11    }
12    else if(piece.type==TYPE_CARROT) {
13        //削除
14        piece.tile.item = nil;
15        [piece timerStop];
16        [piece removeFromSuperview];
17        [pieceView release];
18        //ニンジンの数
19        carotCount--;
20        if(carotCount <= 0){
21            //ゲームクリア
22        }
23    }
24}
  • 「ゲームの演出」サンプルプログラム

STUDIO SHIN

家庭用ゲームの企画開発、Mac OS / iOSアプリの開発を主な生業とする。
20年ほど前から家庭用ゲーム開発に携わりファミコンからDS、PSP、Wiiまで幅広く開発。15年前からMac OS Xアプリケーションを開発「DotShotX」「GIFQuickMaker」などを公開。iPhoneアプリ「将棋盤」「DotTouch」「Rabbit Maze」などを開発。開発アプリはアップルのApp Storeで公開中。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています