短縮版
車両ラベルを重複しない方法で配布し、参照する車両のできるだけ近くに配置するための設計パターンはありますか?そうでない場合、私が提案する方法のいずれかが実行可能ですか?これを自分でどのように実装しますか?
拡張版
私が書いているゲームでは、空飛ぶ車両の鳥瞰図を持っています。また、各車両の隣には、車両に関する重要なデータが記載された小さなラベルがあります。これは実際のスクリーンショットです。
現在、車両は異なる高度で飛行する可能性があるため、アイコンが重なる可能性があります。ただし、ラベルが重複しないようにします(または、車両「A」のラベルが車両「B」のアイコンに重複することはありません)。
現在、スプライト間の衝突を検出することができ、問題のラベルを、それ以外の場合はオーバーラップしているスプライトとは反対の方向に押すだけです。これはほとんどの状況で機能しますが、空域が混雑すると、代替の「スマート」な代替手段があったとしても、ラベルが車両から非常に遠くに押し出される可能性があります。たとえば、次のようになります:
B - label
A -----------label
C - label
取得する方が良い場所(=車両に近いラベル):
B - label
label - A
C - label
編集:また、重複車両の場合のほかに、車両のラベルA
が重複する可能性のある他の構成が存在する可能性があることも考慮する必要があります(ASCIIアートの例は、たとえば、のラベルがB
およびC
)。
現在の状況を改善する方法について2つのアイデアがありますが、それらを実装する時間を費やす前に、アドバイスを求めてコミュニティに頼ることを考えました(結局、そのためのデザインパターンが存在する可能性がある「共通の十分な問題」のようです)。
それが価値があるものについて、私が考えていた2つのアイデアがあります:
ラベルスペースのスロット化
このシナリオでは、すべての画面をラベル用の「スロット」に分割します。次に、各車両のラベルは常に最も近い空のラベルに配置されます(空=その場所に他のスプライトはありません)。
スパイラル検索
画面上の車両の位置から、重複しない位置が見つかるまで、角度を大きくしてから半径を大きくしてラベルを配置しようとします。以下のようなもの:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...