モンスターをプレイヤーに近づけるようにする

  今回はモンスターがプレイヤーに近づいていくようにするプログラムを作成しました。

~今回の内容~




左側の蟻にご注目ください。この画面から下方向へボタンを押します。


プレイヤーは下に移動し、蟻は上に移動したのがわかります。またこの状態から下にプレイヤーを動かします。


プレイヤーが下に移動しました。そして蟻は右に移動していることがわかります。この状態から今度は右に何マスか移動させましょう。


プレイヤーが右に移動しています。ついでに蟻もプレイヤーに追随するように移動しているのがわかりますでしょうか。この状態からまた右に移動してみます。


今度はありだけではなく左下にいる犬もプレイヤーに近づいています。
今回はこのような動作をどのようにプログラムしたのか解説します。

~プログラムの説明~

モンスターとプレイヤーの距離を把握する

 今回の動作を実現するにあたり、モンスターがプレイヤーの座標を把握する必要があります。そのため、モンスターオブジェクトに新しくプロパティとメソッドを追加しています。下が追加したプログラムになります。

583行目にthis.dis、584行目にthis.xdis、585行目にthis.ydisを追加しました。 


607~612行目にかけてthis.discalcメソッドを追加しています。
 608行目ではthis.xdisにモンスターのx座標とプレイヤーのx座標の差を代入しています。
 609行目ではthis.ydisにモンスターのy座標とプレイヤーのy座標の差を代入しています。
 610行目でモンスターとプレイヤーがどのくらい離れているかを計算しています。この計算には2点間の距離を求める公式を使っています。
 これらの処理を画像を使って解説します。


プレイヤーとモンスターが上記の位置関係にあるとします。この位置関係を三角形で表すと画像のように、底辺がxdis、高さがydis、斜辺がdisといったように表せます。2点間の距離を求める公式は√(x2-x1)^2+(y2-y2)^2となります。この式に上記の情報を当てはめることでモンスターとプレイヤーの距離を導くことができます。
 まず、608行目のthis.xdis = (this.px - playerpx)はxdis = (3 - 1)がとなります。答えはxdis = 2になります。
 609行目のthis.ydis = (this.py - playerpy)はydis = (2 - 1)となります。答えはydis = 1になります。
 610行目の2点間の距離の公式に当てはめてみます。 dis = √2^2 + 1^2 となります。
dis = √5となります。これを数字に直すと dis = 2.23606... となります。プログラム上ではどうなっているのか見てみましょう。


 説明と同じ結果になりました。この計算をプレイヤーとモンスターの位置関係が変わる度に行います。
 ちなみに、隣同士にいる場合はxdis、ydisのどちらかが1と0になるため、disの値は1になります。

 これによりモンスターとプレイヤーがx座標、y座標においてどれだけ離れているのかをプログラム上で認識することができました。色々と応用が利きそうですね。

モンスターをプレイヤーに近づける

 それではモンスターをプレイヤーに近づけさせるプログラムの解説に入ります。

モンスターオブジェクトのmoveメソッドです。
 617行目から条件分岐を追加しました。条件はthis.disが1以外の時です。プレイヤーとモンスターが隣同士でないときのモンスターの移動に動作するプログラムです。
 626行目の条件式を加えました。this.disが5よりも上の時です。これは、モンスターとプレイヤー間の距離を計算した結果、5よりも上であるとき(遠い時)にモンスターをランダムに動かすようにしています。


728行目からはthis.disが5以下の時のプログラムです。ここからがモンスターを近づけさせるプログラムになります。
 729行目では変数absxdisにthis.xdisの絶対値を代入しています。730行目でも同じ処理を行っています。
731~738行目ではモンスターがプレイヤーに対して左上にいるときに動作するプログラムを書いています。条件はモンスターのx、y座標がともに負の値の場合です。

 位置関係の考え方を画像を使って説明します。


 コンピュータ上では2次元平面の座標は画面の左上(画像ではaの部分)を(0 , 0)とし、右に進むたびにx座標が増え、下に進むたびにy座標が増えるようになっています。このことから、モンスターがプレイヤーに対して左上にいるときは画像のようになり、プレイヤーから敵の座標を把握した際にはx座標、y座標ともに負の値になるということがわかるでしょうか。

 話を戻します。

 732行目でまた条件式を書いています。条件はxdisがydis以上の時です。この時、敵を右に動かします。
 735~737行目はydisが多きい時の処理で、モンスターを下に動かします。
この条件式は、モンスターがプレイヤーに向かって上下左右に動くとき、均等に動かすために行っています。
 同じような処理をモンスターが右上、左下、右下にいる場合に分けて行っています。

以上がモンスターをプレイヤーに近づけるようにするプログラムです。

おわり

 いかがでしたか。実はこのプログラム、1か月ほど前に作成していてブログを書いている現在は思い出しながら書いています。なので説明を端折っているところや上手く説明できていない点もございますが、なにとぞご了承ください。

参考文献

浅見 尚. "5分でわかる!2点間の距離の公式". TryiT. 
        (2024-10-27参照)
"【JavaScript】算術演算 - 四則演算・剰余・累乗と計算の優先順位". ITHACK. 
        (2024-10-27参照)

コメント

このブログの人気の投稿

自己紹介と作成するゲームの説明

ランダムにモンスターを出現させる

マップをランダムで生成する