PR

ゲームの演出

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

ゲームクリアの条件作成

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

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

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

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

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

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

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

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

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

ニンジンの取得チェック

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

- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag 
    {
    ~略~
    //移動中
    if( state==STATE_MOVEING ){
        GamePieceView*	carot = (GamePieceView*)nextTile.item;
        if( carot && carot.type==TYPE_CARROT){
            //ニンジンを取った
            carot.state = STATE_DEAD; // ステータスを死亡にする
        }
        ~略~
    }
  
}

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

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

//死亡通知
-(void)gamePieceDead:(GamePieceView*)piece {
    //ウサギが死亡
    if( piece == pieceView ){
        //削除
        pieceView.tile.piece = nil;
        [pieceView timerStop];
        [pieceView removeFromSuperview];
        [pieceView release];
        pieceView = nil;
    }
    else if(piece.type==TYPE_CARROT) {
        //削除
        piece.tile.item = nil;
        [piece timerStop];
        [piece removeFromSuperview];
        [pieceView release];
        //ニンジンの数
        carotCount--;
        if(carotCount <= 0){
            //ゲームクリア
        }
    }
}
Think IT会員限定特典
  • 「ゲームの演出」サンプルプログラム

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のWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスのご案内

関連記事