続・ゲームのロジック作成

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

攻撃とダメージの対応

前回はオオカミがうさぎを追いかけるようになるところまでを作った。今回はオオカミから攻撃されたうさぎがダメージを受けるまでの流れを説明しよう。また、前回は開始されたらオオカミはすぐにうさぎを追いかけてきたが、最初は眠っていてうさぎが動き出したら追いかけ始めるようにしてみる。

まずうさぎとオオカミの追加画像を用意する。左から「死亡」「眠り」「ダメージ」だ、これらは第4回の「デザインデータの作り方」でも説明したと思う。攻撃のパターンは各方向の移動パターンの1コマ目を使う。

図1:追加キャラ画像

それではまずキャラクターのクラスである、GamePieceView.h のキャラステータスにいくつか定義を追加する。今までは停止と移動だけだったが「死亡」以降のステータスを追加する。

01//ステータス
02typedef enum{
03  STATE_STAY            =0, //停止
04  STATE_MOVEING         =1, //移動
05   
06  STATE_DEAD            =2, //死亡
07  STATE_SLEEP           =3, //眠り
08  STATE_DAMAGE          =4, //ダメージ
09   
10  STATE_ATTACKSTART     =5, //攻撃開始
11  STATE_ATTACK          =6, //攻撃
12} PieceState;

また、移動方向を現すための MovAngleTypev にも「死亡」以降の定義を追加する。「正面」「左」「右」「後ろ」の番号が前回のサンプルから変更されている、これはこの定義を配列にある画像のインデックス値も兼ねるようにするためだ。

01typedef enum{
02  MOVANGL_NON           =-1,
03   
04  MOVANGL_FRONT         = 0,    //正面
05  MOVANGL_LEFT          = 3,    //左
06  MOVANGL_RIGHT         = 6,    //右
07  MOVANGL_BACK          = 9,    //後ろ
08   
09  MOVANGL_DEAD          =12,    //死亡
10  MOVANGL_SLEEP         =13,    //眠り
11  MOVANGL_DAMAGE        =14,    //ダメージ
12   
13} MovAngleType;

GamePieceView に以下のプロパティーを追加しておく。delayTimerはステータス切り替え時に必要な場合、動作の待ち時間を設定するためのもので、life はキャラクターのライフ値だ。これが0になれば「死亡」と判断する。

1float           delayTimer;
2int         life;

以下のデリゲートメソッドも追加しておく。攻撃可能かを判断して攻撃対象のオブジェクトを返すデリゲートメソッドと、キャラクターの死亡を通知するデリゲートメソッドだ。

1@protocol GamePieceViewDelegate
2  ~ 略 ~
3-(GamePieceView*)gamePieceIsAttack:(GamePieceView*)piece;
4-(void)gamePieceDead:(GamePieceView*)piece;
5@end

それから前回のサンプルプログラムについて補足だが、キャラクター画像の更新処理を変更している。具体的には、これまでは画像の配列から取り出したUIImageを drawRect: の中で描画していたが、変更後はCALayerのコンテンツを更新する方法になっている。

01-(void) update {
02  if( [imageArray count] ){
03    int     anime=0;
04    //移動中
05    if( state==STATE_MOVEING ){
06        anime = animeIndex;
07    }
08    UIImage*    image = [imageArray objectAtIndex:imageIndex+anime];
09    self.layer.contents = (id)image.CGImage;
10  }
11}

キャラクターステータス変更仕様

まずはキャラクターのステータスを変更する仕様をこのように決めておく事とする。動きの基本は「停止パターン」だ。何らかの動きをした後は停止パターンに戻ってくるように動かす。実際はオオカミはダメージを受けないのでダメージパターンには行かないし、うさぎも攻撃する事はないので攻撃パターンには行かないがそこはtypeプロパティーによって切り分ける。

図2:キャラクターパターン推移

今回変更するのは主にGamePieceViewクラスのタイマーにより呼び出される moveAction:と、stateプロパティーのアクセッサメソッド setState: だ。この2つのメソッドの中で現在のstateプロパティーとtypeプロパティーにより処理を切り分けるようにする。

  • 「続・ゲームのロジック作成」サンプルプログラム

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

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