テラリウム徹底攻略ガイド(改訂版)

KAnimalクラスのBeginChaseメソッド

大石 晃裕+デジタルアドバンテージ
2003/05/10
Page1 Page2 Page3 Page4

敵を追いかけるBeginChaseメソッド

 さて、前回でKAnimalクラスについて解説が終わっていないものが少し残っていた。それについて解説する。

 まず、今回のKomagomeで使用しているBeginChaseメソッド。このメソッドは、例えばほかの生物を攻撃するときなどにその生物を追いかけるためのメソッドだ。相手のスピードの2倍+1か、前回解説したKAnimalクラスのFavSpeedプロパティのどちらか大きい方で追いかけるので、ある程度追いつけるようにはなっている。ただし、相手の移動スピードがこちらの最高スピードを超えてしまったときはこの限りではないが。

 それではソースを見てみよう。

protected void BeginChase(AnimalState target) {
  if(target == null) {
    return;
  }
  chase = target;
  double dist = DistanceTo(target);
  Point P = target.Position;
  if(target.CurrentMoveToAction != null) {
    MovementVector mv = target.CurrentMoveToAction.MovementVector;
    Point D = mv.Destination;
    Vector vector = Vector.Subtract(target.Position,D);
    vector = vector.GetUnitVector().Scale(dist * chaseAlpha * mv.Speed);
    P = Vector.Add(P,vector);
  }
  int speed = Math.Max(target.Speed * 2 + 1,FavSpeed);
  BeginMoving(P,speed);
}
KAnimalクラスで定義されているBeginChaseメソッド

 これは、相手の座標を表すベクトルをT、相手の速度ベクトルをV、目標座標を表すベクトルをPとすると、

P = α * dist * V + T

というベクトル式を利用して、移動するポイントを導き出すようにしている。distについては、自分と相手との距離を表すスカラー値であり、αについてはKAnimalクラスで規定した、どれぐらい先回りをするのかという調整を行うスカラー定数である。distをかけている意味だが、これは近づけば近づくほど先回りする距離を短くしたいためだ。そして、αが大きいほどより敵の目的地に先回りをするようになる。

 これらの関係を図示すると次の図のようになる。

BeginChaseメソッドで想定している自分と敵の移動ベクトル

 さて、それではコードを少し解説しよう。

 まず一番初めに、targetをchaseというメンバ変数に代入している。これは現在追っている敵を示すKAnimalクラスのフィールド変数である。

chase = target;

 次にdistという、相手との距離を示すローカル変数を作成している。

double dist = DistanceTo(target);

 次にターゲットとなる生物が移動先として設定している位置を取得する。これはターゲットの生物がBeginMovingメソッドを呼び出したことにより生成されたCurrentMoveToActionオブジェクトから得ることができる(実際にターゲットの生物がBeginMovingメソッドを呼び出しているのは現在よりも以前のターンである。ターゲットが移動を行っていない場合にはこのオブジェクトはnullとなる)。

MovementVector mv = target.CurrentMoveToAction.MovementVector;
Point D = mv.Destination;

 それが終わると、次にVectorクラスのインスタンスを作成している。これはテラリウムに用意されているクラスであるので、詳しくはリファレンス・マニュアルである「Terrariumオブジェクトモデル」のドキュメントを参照していただきたい。

Vector vector = Vector.Subtract(target.Position,D);
vector = vector.GetUnitVector().Scale(dist * chaseAlpha * mv.Speed);

 ここでは、簡単にいえば、「相手のいまいる座標からどれぐらい移動目標をずらせばいいのか」ということを表すベクトルを求めている。1つ1つ追っていくが、まず一番初めに相手のいる位置から相手の目的地までのベクトルを、Substractというメソッドを使い算出している(なお、Terrariumオブジェクトモデルの解説では、Substractメソッドは第1引数から第2引数を引くとされているが、これは間違いで、実際には第2引数から第1引数を引くようだ)。そして算出されたベクトルの単位ベクトルをGetUnitVectorで取得し、それを、Scaleメソッドを使い、dist * chaseAlpha * mv.Speed倍にスケーリングしている。chaseAlphaが上の式でいうαである。

 これでいまの相手の座標からどれぐらい移動目標をずらせばいいのかということが取得できたので、あとは相手の座標を表すベクトルと作成したベクトルを合成し、移動目標が生成される。これがPに代入されているものだ。

P = Vector.Add(P,vector);

 その次に、スピードを設定しているのだが、相手の2倍の速度+1と、FavSpeedを比較し、大きい方をspeedというローカル変数に代入している。

int speed = Math.Max(target.Speed * 2 + 1,FavSpeed);

 そしてBeginMovingで移動を指定している。

BeginMoving(P,speed);

 何やら数学の解説になってしまったが、これは簡単にいえば、未来に相手がいるだろう位置に目標を設定して移動させているだけだ。


 INDEX
  テラリウム徹底攻略ガイド(改訂版)
  第5回 KAnimalクラスを使った肉食動物の作成
     肉食動物を作成する
     肉食動物の行動パターン
   KAnimalクラスのBeginChaseメソッド
     KAnimalクラスのGetBypassメソッド
 
インデックス・ページヘ  「テラリウム徹底攻略ガイド(改訂版)」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間