ゲームマップのデータ構造
前回 はマス目の上で駒を動かす仕組みを説明した。今回はそれを使ってどのように「Rabbit Maze」のキャラクターを動かしているかを解説する。ここで改めて、「Rabbit Maze」はどのようなゲームかを説明しておこう。こちらのYouTubeのデモ動画にて確認していただきたい。
VIDEO
今回のサンプルプログラムは、横8マスx縦10マスで区切られたマップの上を、タップされたマス目を目指してキャラクターがマス目単位で移動を行うというものだ。駒を「Rabbit Maze」で実際に使用しているうさぎのキャラクターに置き換えて移動中は走るアニメーションをさせてみよう。
図1:今回のサンプルプログラム(クリックで拡大)
今回のサンプル一式は、会員限定特典としてダウンロードできる。記事末尾をご確認いただきたい。
そのために前回のサンプルコードのGameControllerとGamePiceViewに変更を加える。まずはGameControllerの初期化メソッドだ。GameBoardViewとGamePieceViewの初期化が変更されている。
01
<!--//--><![CDATA[// ><!--
03
- (id) initWithBaseView:(UIView*)baseview {
07
NSMutableArray* tileArray = [NSMutableArray array];
08
int x, y, tileIndex = 0;
09
for (y=0; y < TILE_H_COUNT; y++) {
10
for (x=0; x < TILE_W_COUNT; x++) {
11
CGRect frame = CGRectMake(x*40, 60+(y*40), 40, 40);
12
GameBoardTile* tile = [GameBoardTile gameBoardTileWith:frame
13
State:MapDefData[tileIndex]];
14
tile.tileIndex = tileIndex;
16
[tileArray addObject:tile];
19
self.gameView = autorelease];
20
[baseview addSubview:self.gameView];
21
self.gameView.delegate = self;
24
NSMutableArray* array = [NSMutableArray array];
26
for(i=0; i < 12; i++){
27
NSString* name = [NSString stringWithFormat:@"rabit00_%03d.png", i];
28
UIImage* image = [UIImage imageNamed:name];
29
[array addObject:image];
37
if(self.targetTile != movTile){
38
self.targetTile = movTile;
デリゲートメソッドの gamePieceNextMovTile: が返す移動先のGameBoardTile は現在の位置から上下左右のどの方向に移動すればより移動先の位置に近づけるかをチェックして、適切なGameBoardTileを返すように実装する、詳しくはサンプルコードを見てもらいたい。
実際の移動処理はCore Animationによって行う。Core Animationの終了時に呼ばれる以下のデリゲートメソッドで、目的のGameBoardTileに到達したかどうかをチェックし、移動を完了するか継続するかを判断する。
01
<!--//--><![CDATA[// ><!--
04
- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
06
self.tile.piece = nil;
08
self.tile.piece = self;
10
if(targetTile==nextTile){
12
imageIndex = MOVANGL_FRONT;
15
if( [delegate respondsToSelector:@selector(gamePieceCAMoveEnd:Position:Finish:)]) {
今回のサンプルプログラムをビルドして実行すれば、タップした位置にうさぎのキャラクターが走るアニメーションパターンで移動することが確認してもらえると思う。
次回はキャラクターのアニメパターンなど、デザインデータの作り方について解説する。