自作ゲームの大福島

プログラムの使えない素人がCF2.5(インディゲームクリエーター)を使ってゲームを作ってみるブログです

スポンサードリンク

オブジェクト間の直線距離を測ってみる cf2.5で三平方の定理

さあ、タイトルだけで文系脳の私達にとっては脳が爆発四散気味ですが、今回は以前の三角関数講座の続き、二つのオブジェクトの直線状の距離の求め方に関するお話です。

 

具体的には二つのオブジェクト間の

f:id:vobo:20171109001411g:plainここ

 

この距離が一体何ピクセル離れているか?を計算する方法を探ってみよう、という事になります。

 今までの三角関数講座記事から、X軸、Y軸の距離は簡単に求められる事が分かっていましたが、直線状の距離に関してはノータッチでしたね。

f:id:vobo:20171109002428j:plain

X軸距離「a」は、右オブジェクトのX座標から左オブジェクトのX座標を引いた値

Y軸距離「b」は、右オブジェクトのY座標から左オブジェクトのY座標を引いた値

でした。

じゃあ、直線距離はどう計算すんの?って事ですが、実は既にCF2.5wikiに答えが出ております。

テクニック集/2つのオブジェクト間の距離を取得する - Multimedia Fusion 2 Wiki*

これによると、計算式は以下のようです。

sqr((X("Object")-X("Target"))pow2+(Y("Object")-Y("Target"))pow2)

                     **公式はwikiより引用**

 

…くっ……

 

くぴぽ?

 となってしまった方は私だけでは無いはずです。まず()の多さに加え、sqrとかpowとか見た事無い英語に心の扉も閉じっぱなしってなもんです。

 

 というわけで、この記事では先人の残してくれた公式を、理解して使いこなす為の解説回となります。前回同様、数学的な正しさは一秒も保障出来ない事をご承知の上で宜しくお付き合い下さい♪

 

理解の為の手順①三角形に置き換えて考えて見る

ここで、さっきの図を三角形に置き換えて考えてみましょう。

何故そうするか?大人の事情です。

f:id:vobo:20171109004504j:plain

するとどうでしょう、よく見ると、直角三角形の斜辺の長さを測ればいいんじゃね!?って事が分かりましたね!狂ったように三角関数を調べ続けた甲斐があったってもんです。

 

理解の為の手順②三平方の定理を理解してみる

さあ、「斜辺の長さ」というキーワードが分かれば後は簡単です。

大人のリテラシー能力を駆使してググりましょう!そうすると、中学当たりでうっすら習った気がする、『三平方の定理』という公式で求められる事が分かります。

 f:id:vobo:20171109004504j:plain

それによれば、

a2 + b2 = c2  

つまり、斜辺の長さを2乗した数字が、辺a、bを2乗した数字の合計と一致するんだそうです。何でそうなるのか?という事に関しては詳しいサイト様で各自調べましょう!

 

理解の為の手順③CF2.5の座標計算を公式に当てはめてみる

辺a,bに関しては、二つのオブジェクトのXY座標を使って簡単に求める事が出来ましたね。それでは、三平方の定理に座標計算の式を当てはめて考えてみましょう。

*以下、右オブジェクトを㊨ 左オブジェクトを㊧と表記

a2 + b2 = c2 

この式が、

(㊨X座標ー㊧X座標)の2乗 (㊨Y座標ー㊧Y座標)の2乗斜辺cの2乗

という事になりますね。

ここで一つ、数式を覚えておきましょう。

『POW』というものです。

POWは「累乗」を表す数式になります。

例えば、「3POW2」と記述すると、3の2乗である9が返ります。

「3POW3」と記述すると、3の3乗である27が返ります。

これを踏まえて、先ほどの式を数式で表してみます。

 (㊨X座標ー㊧X座標)POW2 (㊨Y座標ー㊧Y座標)POW2=斜辺cPOW2

と、いうように、大分wikiの公式に近づいてきましたね!

それでは、最後に、斜辺cの数字を求めましょう。

 

 理解の為の手順④斜辺aを求める数式を理解する

 f:id:vobo:20171109004504j:plain

辺a(X軸の差異)を2乗したものと辺b(Y軸の差異)を2乗したものの合計値は上の公式で簡単に出てきますね。

ここで厄介なのは、2辺abの2乗の合計が、斜辺cの2乗である事。

つまり、2辺abの2乗の合計が仮に「9」だとしたら、これを2乗する前の数字に直してやらねばなりません。

ここで覚えるべき数式が『sqr』です。

sqrは、「平方根」という物で、「ルート」とも言います。「√9」と表すと思い出す方も多いんではないでしょうか?

sqr(  )と記述する事で、()内の数字を2乗する前の数字を返します。

例えば、sqr(25)と記述すると、25を2乗する前の数字「5」が返ってきます。(5×5=25)

それでは、これも踏まえて、先ほどの公式を書き換えてみましょう!

この状態から

(㊨X座標ー㊧X座標)POW2 (㊨Y座標ー㊧Y座標)POW2=斜辺cPOW2

こう書き換えてみます。

sqr((㊨X座標ー㊧X座標)POW2 (㊨Y座標ー㊧Y座標)POW2)斜辺c

式の左側を「sqr」で囲った事で、斜辺cを2乗する必要が無くなった事が分かるでしょうか?これで後は斜辺cを変数に代入してやれば、二つのオブジェクトの直線距離を求める事が出来ます!

 

f:id:vobo:20171109180238j:plain

こんな風に記述してやる事で、二つのオブジェクト間の距離を常に取得する事が出来ます。

直線距離を記録した変数をカウンターで表示させてやると、

f:id:vobo:20171109180924g:plain

こんな感じです。ちゃんと計算されていますね!

この直線距離計測を応用する事で、

「絶対当たる放物線軌道の攻撃」とか、「常に最短距離にいるオブジェクトをサーチする攻撃」なんかも出来るようですね。

 

ただ、前者の放物線軌道は、海外のユーザーさんがアップしたイベントサンプルを拝見したのですが、計算が高度過ぎて、一秒も理解出来ませんでした♪

お願いします、誰か私に教えてくだせぇ…