キャラクターの移動

2011年4月22日(金)
北村 真二

ゲームマップのデータ構造

前回はマス目の上で駒を動かす仕組みを説明した。今回はそれを使ってどのように「Rabbit Maze」のキャラクターを動かしているかを解説する。ここで改めて、「Rabbit Maze」はどのようなゲームかを説明しておこう。こちらのYouTubeのデモ動画にて確認していただきたい。

今回のサンプルプログラムは、横8マスx縦10マスで区切られたマップの上を、タップされたマス目を目指してキャラクターがマス目単位で移動を行うというものだ。駒を「Rabbit Maze」で実際に使用しているうさぎのキャラクターに置き換えて移動中は走るアニメーションをさせてみよう。

図1:今回のサンプルプログラム(クリックで拡大)

今回のサンプル一式は、会員限定特典としてダウンロードできる。記事末尾をご確認いただきたい。

そのために前回のサンプルコードのGameControllerとGamePiceViewに変更を加える。まずはGameControllerの初期化メソッドだ。GameBoardViewとGamePieceViewの初期化が変更されている。

01<!--//--><![CDATA[// ><!--
02 
03- (id) initWithBaseView:(UIView*)baseview {
04    self = [super init];
05  if (self != nil) {
06    //ゲームビュー生成
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
13State:MapDefData[tileIndex]];
14                                                tile.tileIndex = tileIndex;
15                                                tileIndex++;
16                                                [tileArray addObject:tile];
17             }
18    }
19    self.gameView =  autorelease];
20  [baseview addSubview:self.gameView];
21  self.gameView.delegate = self;
22   
23  //キャラクターの生成
24  NSMutableArray*   array = [NSMutableArray array];
25  int    i;
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];
30    }
31    pieceView = ;
32    }
33  }
34  //移動中
35  else {
36    //移動先が違うので再設定
37    if(self.targetTile != movTile){
38        self.targetTile = movTile;
39    }
40  }
41}
42 
43//--><!

デリゲートメソッドの gamePieceNextMovTile: が返す移動先のGameBoardTile は現在の位置から上下左右のどの方向に移動すればより移動先の位置に近づけるかをチェックして、適切なGameBoardTileを返すように実装する、詳しくはサンプルコードを見てもらいたい。

実際の移動処理はCore Animationによって行う。Core Animationの終了時に呼ばれる以下のデリゲートメソッドで、目的のGameBoardTileに到達したかどうかをチェックし、移動を完了するか継続するかを判断する。

01<!--//--><![CDATA[// ><!--
02 
03//アニメーション停止
04- (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
05  //現在の位置を更新
06  self.tile.piece = nil;
07  self.tile = nextTile;
08  self.tile.piece = self;
09  //移動先に到達
10  if(targetTile==nextTile){
11      isMoveing = NO;
12    imageIndex = MOVANGL_FRONT;
13    animeIndex = 0;
14    //デリゲートメソッド
15    if( [delegate respondsToSelector:@selector(gamePieceCAMoveEnd:Position:Finish:)]) {
16        CALayer*    layer = ;
17    }
18  }
19}
20 
21//--><!

今回のサンプルプログラムをビルドして実行すれば、タップした位置にうさぎのキャラクターが走るアニメーションパターンで移動することが確認してもらえると思う。

次回はキャラクターのアニメパターンなど、デザインデータの作り方について解説する。

  • 「キャラクターの移動」サンプルプログラム

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メルマガ会員のサービス内容を見る

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