ゲームの演出
ゲームクリアの条件作成
前回はウサギがオオカミに攻撃されてゲームオーバーするまでの流れを作成した。今回はまずゲームクリアに至る流れを作成してみよう。
「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){ //ゲームクリア } } }
「ゲームの演出」サンプルプログラム