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

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

北村 真二

2011年5月20日 20:00

攻撃とダメージの対応

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

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

図1:追加キャラ画像

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

 

//ステータス
typedef enum{
  STATE_STAY			=0,	//停止
  STATE_MOVEING			=1,	//移動
  
  STATE_DEAD			=2,	//死亡
  STATE_SLEEP			=3,	//眠り
  STATE_DAMAGE			=4,	//ダメージ
  
  STATE_ATTACKSTART		=5,	//攻撃開始
  STATE_ATTACK			=6,	//攻撃
} PieceState;

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

typedef enum{
  MOVANGL_NON			=-1,
  
  MOVANGL_FRONT			= 0,	//正面
  MOVANGL_LEFT			= 3,	//左
  MOVANGL_RIGHT			= 6,	//右
  MOVANGL_BACK			= 9,	//後ろ
  
  MOVANGL_DEAD			=12,	//死亡
  MOVANGL_SLEEP			=13,	//眠り
  MOVANGL_DAMAGE		=14,	//ダメージ
  
} MovAngleType;

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

float			delayTimer;
int			life;

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

@protocol GamePieceViewDelegate
  ~ 略 ~
-(GamePieceView*)gamePieceIsAttack:(GamePieceView*)piece;
-(void)gamePieceDead:(GamePieceView*)piece;
@end

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

-(void) update {
  if( [imageArray count] ){
  	int		anime=0;
  	//移動中
  	if( state==STATE_MOVEING ){
  		anime = animeIndex;
  	}
  	UIImage*	image = [imageArray objectAtIndex:imageIndex+anime];
  	self.layer.contents = (id)image.CGImage;
  }
}

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

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

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

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

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30