1

私のプロジェクトにはかなりの問題があります。私は現在、タワーディフェンスゲームのように見えるものを作ろうとしています. HTML canvas 要素を使用します。

私の問題は、現在、クリープが円の塔の近くにあるかどうかを検出できる方程式が見つからないように見えることです。

クリープが 10 に ax と 10 に y を持っていたとしましょう。次に、タワーには 30 に ax と 30 に ay があります。ここで、直径が 20 の円でタワーの近くのすべてのクリープを検出したいとします。

その方程式は JavaScript ではどのように見えるでしょうか?

-

ありがとうございます

4

2 に答える 2

3

方程式は次のようになります (2 つのベクトル/ポイント間の距離)。

sqrt((x1-x2)^2 + (y1-y2)^2)

それは2次元ベクトル用です。幸運を!

于 2012-05-19T22:46:23.117 に答える
1

おい、コメンテーターの何人かは、質問者にもう少し余裕を持たせる必要がある。多くの人にとって、これが直角三角形に関する問題に分解できることは必ずしも明らかではありません。


Marjin の答えは正しいですが、実際にはさらに一歩進んで、はるかに効率的になり、最終的にゲームの全体的なパフォーマンスを向上させることができます。

Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2));

x1,y1 と x2,y2 の間の距離が得られますが、実際には平方根の部分を実行する必要はありません。

ほら、距離が何であるかはあまり気にしませ。別の距離よりも多いか少ないかだけを気にします。したがって、常に 2 つの距離を比較することになります。この場合、上記の式からの距離を 200 と比較することになります。距離を比較しているので、代わりに 200 を 2 乗することができます。

Math.pow(200, 2)

距離の二乗を取得します。次に、平方根なしで上記の式を使用できます。

Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);

数式を 200 ではなく 40000 と比較します。これの利点は、Math.pow200 を 1 回呼び出すだけでよく、その代わりにこれまで呼び出す必要がないことMath.sqrtです。1 秒間に何度も多くのクリープをチェックすることになるため、これらの呼び出しが合計され、距離の代わりに距離の 2 乗を比較している場合、ゲームのパフォーマンスが向上するはずです。

以下は、目的に合わせてそれらを使用する方法がほとんど同じであることを示すコード例です。を使用しておりconsole.log、その見方がわからない場合は、このチュートリアルの最初の 2 つの部分のビジュアルを参照してください。

コードは次のとおりです。

http://jsfiddle.net/4aPjB/

于 2012-05-20T04:22:43.090 に答える