ゲーム内でマップ内を移動することを実装するとき、最近では使用するのが流行になりました
正六角形のスペースポイント(hex)。 これは本当に多くの問題を解決します。 たとえば、ポリゴンの角を移動する必要はありません。 移動の6つの方向は、移動のリアリズムを伝えるのに十分です。

図1 座標系
マップ上のポイントを固定する場合、座標に小数値を使用しないと個々のセルの位置を特定するのが難しくなり、計算が複雑になるため、慣れ親しんだデカルト座標系の使用は不利になります。 同様に重要なのは、セル間の距離の計算、射撃中および射撃中の障害物のアクションの計算です。 したがって、最初に便利な座標系を選択する必要があります。 隣接セルに移動すると、座標グリッドの1つの軸に沿った単位値のシフトに対応するという事実により、計算が大幅に簡素化されます。

図2。 座標軸によって形成されるセクター
軸のベクトル方向のオプションを慎重に検討するとき、最も便利なのは、軸の方向間の角度が120°に対応する場合です。 3つの座標軸は、6つの移動方向に対応しています。
同様のシステムは、空間内のすべてのポイントがある限り冗長です。
無限の数の方法で記述できます。各方法は原点から点への移動の軌跡になりますが、最短経路は最も近い座標軸に投影することにより独自の方法で記述されます。 実際、図2に示すように、3つのペアを表す6つのセクターを取得し、それぞれに隣接する2つの座標軸を使用して、その中にあるポイントを記述します。

図3 ポイント座標
この表現では、図3に示すように、ポイントの座標が固定されます。
座標を通常のビューに変換する
通常、このような座標レコードは、近くの座標軸への投影に対応する座標原点からの最短パスを表すときに呼び出します。
座標が通常の形式であることを判断するために、それに固有のいくつかのプロパティを区別できます。
- 座標は2軸の投影により通常の形式で記録されるため、3つの座標の1つは0に等しくなければなりません。
他の2つの座標は、一致する必要があります。1つ> = 0、もう1つは<= 0です。2つの軸の半分は各セクターに隣接しており、一方は常に正で、もう一方は負です。
これらのプロパティは、座標が通常の形式で記録されていることを確認するために必要かつ十分です。
図4 3座標の単位シフト
座標を正規化する問題を解決する前に、この座標系の次の特性に注意してください。3つの座標すべてに沿った単位シフトにより、同じポイントに到達します(図4)。 これに基づいて、再変換を取得します。
(x、y、z)=(x + c、y + c、z + c)、ここでcは定数
レコードの通常のビューを取得するために、ポイントの座標は2つの軸を見つけるだけで済みます。この式により、原点からの最小距離が得られ、上で提案した式に従って必要な形式になります。 取得する必要があります
(c1、c2、c3)、ここでc2 = 0かつc1 <= c2 <= c3、
つまり、変換前に、
c2 = cおよびc1 + c <= c2 + c <= c3 + c
つまり、非正規化レコードでは、その値が他の2つの値の間にあるようにそのような座標を見つけ、ポイントのすべての座標からこの値を引く必要があります。
平面上の点間の距離の計算
点の座標は、原点から点までの最短経路として与えられます。つまり、原点から点までの距離は
R0 = | x | + | y | + | z |
点ベクトルの差は座標を与え、それは通常の形ではそれらの間の距離に対応します。
R = | x1-x2 | + | y1-y2 | + | z1-z2 |
ポイント間の障害物を検索する
一般的な問題について説明したので、カードを使用したコンピューターゲームでよく発生する問題の解決を試みることができます。
距離を置いて撮影すると、途中で遭遇する可能性のある障害物にぶつかる可能性があります。
図5 発射時に障害物を探す
これにより、発射物が落ちる可能性のある障害を見つけるタスクが設定されます。 この問題には、一般的にソリューションに対する2つのアプローチがあります。
- 発射物の動きを妨げる可能性のある障害物が配置される可能性のある空間のポイントを検索し、それらを確認します。
その場所にあるすべての障害物を列挙し、それらが射線上にないことを確認します。
この問題を検討するとき、私は最初の解決策に傾倒します。これは、発射物が移動できなかった発射物の動きの方向で最初に遭遇した障害物が、他のアプローチとは異なり、問題の解決策を完了するためです。
したがって、攻撃者からのパスを開始する場合、すべてのポイントとすべての障害物を常にソートする必要はありません。
このアプローチには別の議論があります。 避難所(障害物)の有効性を確認するには、多くの場合、射手または被害者までの距離を知る必要があります。
前者の場合、私たちはいつでもそれを知っており、計算を必要としません。2番目の場合、障害物の条件を満たす各オブジェクトについて、射手と犠牲者からの距離を計算する必要があります。
図5 ポイントAは矢印、Bは被害者です。 障害がある可能性のあるドットは灰色でマークされています。
発射体の動きである「セル」ラインに沿って通過するときのセルのシフトは、座標軸に沿ったシフトに比例して発生します。 3番目の座標は、ショットベクトルが通常の形式になるため、この問題を解決するためには使用されません。 ショットはセルの中央から始まり、セルの中央で終わるため、結果には丸めが必要になります。
y = y(AB)/ x(AB)* x
まとめ
このレビューでは、マップを使用したゲームで発生する特定の瞬間の一部のみを検討しました。これは、便利な座標グリッドを示すために行われました。
このような座標系を選択すると、ほとんどの計算が算術になります。 すべての座標は整数であり、キャラクターの移動ルートを説明し、移動の方向を明確に示す便利な機会を提供します。
このようなシステムのコストは、単純な配給システムによって相殺される冗長性と考えることができます。
- 発射物の動きを妨げる可能性のある障害物が配置される可能性のある空間のポイントを検索し、それらを確認します。