連載 :
実践!iOSで作るゲームアプリゲームのロジック作成
2011年5月13日(金)

うさぎとオオカミの位置調整
ここまでの変更でオオカミがうさぎに向かって移動してくるようになる。ただしこのままではオオカミとうさぎは同じマス目に重なって停止してしまう。そこで同じマス目に複数のキャラクターが配置されないようにしてみよう。それから、今までは停止しているか移動しているかをフラグで判断していたが、今後の拡張のために、それに変わるステータスプロパティーをGamePieceViewに追加する。
//ステータス
typedef enum{
STATE_STAY =0, //停止
STATE_MOVEING =1, //移動
} PieceState;
@interface GamePieceView : UIView {
~ 略 ~
PieceState state; //ステータス
}
~ 略 ~
@property (nonatomic, assign) PieceState state;
@end
さらにキャラクターの移動停止をチェックするデリゲートメソッドもプロトコルに追加する。
//プロトコル宣言 @protocol GamePieceViewDelegate ~ 略 ~ -(BOOL)gamePieceIsMoveFinish:(GamePieceView*)piece; @end
このメソッドはGamePieceViewの移動アニメーション終了の animationDidStop:finished: の中で呼ぶようにし、GameControllerで以下のように実装する。マス目のインデックス値からオオカミとうさぎが隣同士にいるかどうかを判定するメソッドを作り、隣接するマス目にいるなら YES を返し移動を終了するようにしている。
// うさぎキャラとの隣接判定
-(BOOL)isNearPlayerPiece:(GamePieceView*)piece {
BOOL ret = NO;
//オオカミの場合...
if(piece.type==TYPE_WLOF) {
int tileIndex, targetIndex;
//オオカミの現在の位置
tileIndex = piece.tile.tileIndex;
//うさぎの現在の位置
targetIndex = pieceView.tile.tileIndex;
if( tileIndex==targetIndex ||
tileIndex+1==targetIndex ||
tileIndex-1==targetIndex ||
tileIndex+TILE_W_COUNT==targetIndex ||
tileIndex-TILE_W_COUNT==targetIndex ) {
ret = YES;
}
return ret;
} else {
return NO;
}
}
// 移動を終了させるなら YES を返す
-(BOOL)gamePieceIsMoveFinish:(GamePieceView*)piece {
return [self isNearPlayerPiece:piece];
}
また、先ほどのうさぎキャラの配置位置を返すメソッドもこの判定メソッドを使い更新しておく。これによりオオカミが停止中の場合はうさぎが隣接位置にいない場合のみ移動を開始するようになる。
// うさぎキャラの配置されているGameBoardTileを返す
-(GameBoardTile*)gamePieceTargetMovTile:(GamePieceView*)piece {
GameBoardTile* tile=nil;
if([self isNearPlayerPiece:piece]==NO){
tile = [pieceView tile];
}
return tile;
}
今回のサンプル一式は、会員限定特典としてダウンロードできる。記事末尾をご確認いただきたい。
次回はもう少しゲームロジックの話をさせてもらおうと思う。
「ゲームのロジック作成」サンプルプログラム
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

