最後の devlog の中で、目的地へのパスを見つけるための親切なシステムを思いつきました。パス スムージングとパス スムージングで検査するガジェット用の一連のノードを生成します。広がる。 パスの形式のインスタンス、青い線で結ばれたノードの黄色い四角形のデバッグ視覚化の利用は、以下で確認されます。
検査を受けるユニットのパス。
この devlog では、ガジェットを取得してパスを確認する方法について説明します。 これはそれほど簡単ではありません。音がします。
最終的な devlog を説明するのに数週間かかりました – 私たちは Invent を制定するために労働力を分散させました。 RTS チャレンジに関するブログを隔週でお届けします。
ナイーブ パス フォローイング
デバイスには最大テンポがあります彼らは圧力をかけることができるかもしれません、そして彼らがどれだけ素早くフリップできるかを決定する回転テンポ。 あなたが望むのは、次のノードへの圧力、そしてそれを達成する一方で、次のノードの方向への配信です。 ただし、これは完全には機能しません。 以下で確認されているように、2 つのノードを介してフリップをストーリーに取り入れます。
これで、ユニットは以下で確認した経路を観測します。フェアウェイスポットライト。
また、単位がどのようにオーバーシュートするかを確認します。最初のノードは非常に。 最初のノードに到達すると最も簡単に回転し始めるため、その後は緩やかに前進するため、フリップ サークル全体が 前 後続のノードの方向を指す停止内になるまで、後続のパス ライン。 そのレベルでは、パス ラインからかなり離れており、その循環の緩和はもはやパス ラインと平行ではありません。
親切に十分ではない多くの理由があります。 このユニットは、熱心なゲーマーが理解するように、ゆっくりと礼拝を回すのはかなり愚かであるようです. また、一連のノードを立て続けにたどり、最高の「レーシングライン」のかなりの負荷としてあらゆる場所で織り成す場合にも劣るようです. さらに悪いことに、オーバーシュートは欠点に逃げ込み、捕まる危険性があります-全体を参照せずに、パスファインディングアルゴリズムは、欠点から遠く離れて停止するためにそのパスをたどる必要があるかもしれません.決められた道を貫く道。
当然の解決策は、早期にフリップすることなので、ターニングサークルはコーナーに適しています。 私たちが必要とする道は、これを崇拝することのようです。
これにより、ユニットのギャップがよりスマートになり、ノードのチェーンを介してよりスマートな「レーシング ライン」が選択されます。 オーバーシュートよりもアンダーシュートの方が真実であるため、フリップで欠点にぶつかる危険性は穏やかですが、実際には、ここでの観察ははるかに困難ではありません (境界には追加の境界ホームがあり、パスは通常、滑らかになっています)。境界の端に沿って緩やかに曲がります)。
この定式化では、ユニットは、より早く、より早く回転を開始する必要があります。それが真実である場合、後続のノードに到達します。 クイズは次のとおりです。
Invent の Pathfinding の習慣には、パスをたどる組み込みの循環がありますが、それは決定されたアルゴリズムを使用します。 それは大まかに「うさぎを観察する」システムを持っており、マーカー(「うさぎ」)が一定距離前方の直線経路線に沿って衝突し、魅力的なオブジェクトがそれをターゲットにします。 これにより、同じ配合でコーナーをアンダーシュートできますが、堅固であってはなりません。 この課題のために、私は特定の解決策を特定したいと考えていました。将来的には、Invent のパスファインディングの習慣にさらに役立つ可能性があります。
数学の時間
鮮やかな幾何学数学スポーツの発展に非常に忠実であり、ここにいくつかの数学情報が手元にある場合があります. 形成期、これが、数学の授業で皆さんが公平に穏やかに耳を傾ける理由です。
これはクリアしたい課題の意図なのかもしれません。 より d 先に距離がありますユニットのレベル p1早回しでお届けできます。
この意図を参照してください:
- 私たちは距離を計算するに値します d.
)
フェアウェイサークルは、レベルを中心としたユニットの回転円です c.
数学に興味のある読者は、おそらくこの意図には、レベル p1 からの 2 つの接線があります。 。 これは、p1 からの道に関して対称です。 から c、および接線が円に接するところから円の中心に向かって親切な角度があります c.
角度 α は、線間の角度 p1
から p0 および p1 ~ p2
.
ギャップ d 私たちが計算したいのは、正に、アスペクト p1 を持つ優しい角度の三角形の隣接する縁です。 , c および t 角度 α÷ 2 と逆の長さ r (回転円の半径).最終レベルは最高です: 角度の付いた三角形の長さを見つけるという課題を切り刻むことができました。 私が大学で学んだ三角法はこれを裏打ちしていたので、少なくともクレイジーな計算は行われません.
残念ながら、このウェブログ システムではリダクションは行われません 現在好評を博しているMathMLは、ブラウザ経由でのプランが全て縮小されているので、数学をテキストコンテンツとして書いて制定するのも当然かと思います。
フリップサークルの計算基本的なプロセスは、回転する円の半径を計算することです。 これはユニットのテンポに依存します s 1 秒あたりのピクセル数とその回転テンポ q
単位はラジアン/秒。
ユニットが頑丈な円を裏返すのにかかる時間を物語に取り入れてください t=2π÷ q。 d=st なので、距離今回カバーするのは 2πs÷q、これは円の円周です。 円周 c=2πr なので、 2π でのダイビングは、半径 r=s÷q.
言い換えれば、チャージを回転テンポで公平に分割し、回転円の半径も節約します! これは、回転テンポがラジアン/秒のガジェットであるという説明に本当に役立ちます。
距離の計算今度は距離が必要です d 角
α÷2 と逆辺の長さ
r、これはフリップ サークルから計算されます。
「SOHCAHTOA」を学んだことがあれば、TOA セグメントはここで関連しています: tan (角度)=逆 ÷ 隣接 。 それを並べ替えて隣接する長さを与えると、 adjacent=reverse ÷ tan(angle)。 今、私たちは、私たちのユニットの流通に関する課題に関して、すべての人々が意識していることに転がり込み、最終的な計算である を救うことができます。 d=r ÷ tan(α÷2).
角度を求める計算がもう一つあります α
側面から p0 , p1
および p2 )。 これには、あなたが勝つことができる角度差の目的が必要です
mathUtils.js 内。流通の強化



権利の有利な実施ここはかなり簡単です。 後続のウェイポイントでフェア ポインティングの単純なアルゴリズムを開始します。 ただし、「まだ到着したか」という状況は、「私はレベルにいますか」から「私は距離内にありますか d のレベル”. その距離にある場合は、次のウェイポイントに沿って移動し、その方向に急旋回することができます。
ここのコードは にあります#TickStateMoving_MoreWaypoints() GameServer クラス内 MovableUnitPlatform
- . ただし、パスをたどる循環には、この計算を公平にするよりも効率的なビットが余分にあります。
ガジェットがどこかに切り替えるようにアドバイスされた場合、ガジェットは現在、次のプロセスで戦います:
- 魅力的であれば、やめてください。

ウェイポイントの方向への誘導を開始し、その後の任意の後続のウェイポイント. 最終ウエイポイントに近づくと、ダウンダウンが実現し、最終ウエイポイントの高いところでのリラックスをアシストします。
これは Finite Tell Machine (FSM)。 これは、ユニットが # moveState
- 値が崇拝される文字列であるプロパティ
"停止"、 "最初に回転"
“魅力的な” 最初のウェイポイントでまっすぐ水平になったらすぐに。 このすべてのコードは #TickMovement で発生します。 () とそれに関連するシステム。 エッジシチュエーション
これを構築している間に、特別な処理が必要ないくつかのエッジ状況が発生しました。 これらの統合:
- しばらくすると、ユニットとその後の 2 つのウェイポイントが直線を形成することがわかります。 この場合、実際にはフリップ距離の計算は失敗します (ほぼゼロ、無限、または NaN の結果が生成されます)。 したがって、ほぼ直線を検出する 次のウェイポイントに切り替わるもう1つのケースです.
- しばらくすると、次のウェイポイントまでの距離が驚くほど短くなります (すなわち




)最終ウェイポイントまでの停止距離を計算するのは難しい – コードは計算します
0.5 this.#maxSpeed this.#maxSpeed / this.#maxDeceleration しかし、それは最も簡単に直線に当てはまります – ユニットが回転している場合、計算は公平ではないかもしれません。 そのための最良の解決策が何であるかはわかりませんが、フリップを作成しない場合は、毎回終了フォールバックがユニットの形成に役立ちます.