タイマーアクションの変更

タイマーアクションの変更

タイマーアクションメソッドはタイマーから1/60ごとに呼び出される。タイマー関係のパラメーターを更新した後、ステータスごとの処理を行っている。

 

-(void) moveAction:(NSTimer*)timer {
  BOOL	update = NO;
  
  delay_mov += 1.0 / 60;	//移動アニメーションのためのカウンター
  
  delayTimer -= 1.0 / 60;	//遅延タイマーを減らす
  if(delayTimer < 0)
  		delayTimer = 0;
  
  switch (state) 
  {
  		case STATE_STAY:			//停止中
  			........
  			break;
  		case STATE_MOVEING:		//移動中
  			........
  			break;
  		case STATE_ATTACKSTART:		//攻撃開始
  			........
  			break;
  }
  if(update)
  	[self update];
  if(delay_mov > 0.1)
  	delay_mov = 0;
}

停止

  animeIndex = 0;
  if( delayTimer == 0 ){
  	//攻撃チェック
  	if([self attackCheck])
  		return;
  	//オオカミの場合...
  	if(type==TYPE_WLOF) {
  		//デリゲートに移動先のタイルを要求する
  		if( [delegate respondsToSelector:@selector(gamePieceTargetMovTile:)] ){
  			GameBoardTile*  ret_tile = [delegate gamePieceTargetMovTile:self];
  			if( ret_tile ){
  				[self moveWith:ret_tile];
  			}
  		}
  	}
  }

delayTimerが0の場合にのみ処理を行う。attackCheckメソッドは攻撃を行うかチェックするメソッドだ。

-(BOOL) attackCheck {
  //オオカミ & 攻撃するか?
  if( type==TYPE_WLOF && [delegate respondsToSelector:@selector(gamePieceIsAttack:)]){
  	//攻撃対象
  	GamePieceView*	piece = [delegate gamePieceIsAttack:self];
  	if( piece ){
  		MovAngleType	attackAngle = [self angle:piece];
  		if( attackAngle!=MOVANGL_NON ){
  			imageIndex = attackAngle;
  			animeIndex = 0;
  			self.state = STATE_ATTACKSTART;
  			return	YES;
  		}
  	}
  }
  return	NO;
}

 

デリゲートに問い合わせ攻撃を行うなら必要な処理を行ってYESを返す。NOなら攻撃は行わない。攻撃をするなら移動のための処理は行わない。以下の内容はこの部分については前回のサンプルコードから変わっていない。キャラクターがオオカミの場合、デリゲートに移動先の要求を出している。移動先として有効なGameBoardTimeが帰ってくればそこに向かって移動を開始する。

移動

  if(delay_mov >= 0.1){
  	update = YES;
  	animeIndex++;
  	if(animeIndex > 2)
  		animeIndex = 0;
  }

こちらも前回のサンプルコードから変わっていない。delay_movが0.1を超えていたら移動アニメーションのパターンを変更するために配列から画像を取得するためのインデックス値を変更するプロパティーを更新している。

攻撃開始

  if( delayTimer == 0 ){
  	self.state = STATE_ATTACK;
  }

delayTimerが0の場合にのみ処理を行う。ステータスを攻撃に変更している。

アニメーション停止時のデリゲートメソッド

アニメーション終了後に呼ばれるデリゲートメソッドにも以下のようなコードを追加する。各ステータスにより必要な処理を行い。自身のステータスの再設定などを行っている。

  - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag {
  //死亡
  if( state==STATE_DEAD ){
  	self.tile.piece = nil;
  	if( [delegate respondsToSelector:@selector(gamePieceDead:)] ){
  		[delegate gamePieceDead:self];
  	}
  	return;
  }
  //ダメージ
  if( state==STATE_DAMAGE ){
  	if(life <= 0)
  		self.state = STATE_DEAD;
  	else {
  		imageIndex = MOVANGL_FRONT;
  		animeIndex = 0;
  		self.state = STATE_STAY;
  	}
  	return;
  }
  //攻撃 
  if( state==STATE_ATTACK ){
  	imageIndex = MOVANGL_FRONT;
  	animeIndex = 0;
  	self.state = STATE_STAY;
  	return;
  }
  //移動中
  if( state==STATE_MOVEING ){
  	~ 略 ~
  	//攻撃チェック
  	if([self attackCheck])
  		return;
  	~ 略 ~
  }
}

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

GameControllerにもいくつかコードが追加されているので、このサンプルコードを確認してもらいたい。

人気記事トップ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