現在、2D グリッド ベースのサンドボックス タイプのゲームに取り組んでいます。技術的には、マップとしての 3D は、グリッド タイルを互いの背後に配置できる 3 次元配列です。ただし、2D でレンダリングされます。Android 向けのリリースを検討しているため、ゲーム内のすべてのスクリプトは非常に効率的である必要があります。
ゲームには、プレーヤーがワイヤーを使用してマシンを電源に接続できるようにする主要な配線メカニズムがあります。すべての回路のワイヤで接続されたすべてのエンティティを効率的に計算する方法が必要です。
私が考えることができる唯一のフェイルセーフな方法は、フラッド フィル アルゴリズムを使用して 1 点から広がり、接続されているすべてのオブジェクトを記録することですが、これは Android アプリには非効率的すぎると感じています。
ゲームの構造とワイヤーに関する情報を次に示します。
- ゲームはJavaで書かれています。
- 現在、すべてのオブジェクトは静的です。
- すべてのオブジェクトは、オブジェクトの位置を反映する配列に保持されます。隣接するオブジェクトとその変数には、配列内の x/y 値を参照するだけでアクセスできます。これは、隣接するブロックを必要に応じて更新できることを意味します。
- ワイヤーはプレイヤーが自由に配置および削除でき、任意のパターンに従うことができます。
- ワイヤは、すべての x/y/z 軸で他のワイヤや機械に接続できます。
- 特定のオブジェクトは電力を出力し、他のオブジェクトは電力を使用します。
私は現在、ワイヤー自体を含むワイヤーのグループに接続されたすべてのオブジェクトを含むwireGroupオブジェクトを持つという方針に沿って考えています。各ワイヤ オブジェクトには、新しいワイヤ (およびマシン) を簡単にワイヤ グループに追加できるようにするワイヤ グループ ID が含まれます。
私が本当に必要としているのは、ワイヤが取り外されたときに接続されたオブジェクトを検出する方法だけです。接続されたオブジェクトが配置されているときにそれを検出するのは簡単です。新しいワイヤの隣にある機械を、隣接するワイヤの wireGroup のリストに追加するだけです。
ワイヤーを外す時に問題が発生します。2 つのオブジェクトを接続する 7 つまたは 8 つの固有のワイヤ パスである可能性があるため、1 つのワイヤを削除した場合の効果を見つけるのは困難です。
例えば:
ここでは、接続されたオブジェクトに変更が加えられていないことがわかります。
ここで、wireGroup は 2 つの wireGroups に分割されます。1 つは青と下の白を含み、もう 1 つは 2 つの白を含みます。
誰かが 2D のみのアルゴリズムを思いついたとしても、それは素晴らしいことです。
申し訳ありませんが、何か重要なことを見逃している場合は、教えてください。修正できるようにします。