
タイルマップから目的のタイルを自動的に選択する手法。
最初は、この記事はTIGSourceに関する質問への回答でしたが、少し拡張して個別に公開する価値があるように思えました。
タスク:美しいプラットフォームレベルを生成し、隣人を考慮してタイルを自動的に配置して、見た目を良くしたい。
隣人に基づいたタイル
スーパーマリオのタイルは隣人を考慮していません。石のブロックは、別個の断片としても壁の一部としても常に同じように見えます。

これは多くのゲームに非常に適していますが、より調和のとれたデザインを作成する場合、不自然に見えるかもしれません。 隣接するものを考慮に入れたタイルは、外観を隣接するタイルと比較することでこの問題を解決します。
1ビットマップ
いくつかのトリッキーなテクニックを使用して、石のブロックとそれらの間の「空気」だけで構成されるプラットフォームレベルの図を作成したと想像してください。 レベルは、各ピクセルの状態が単一ビット(1-石ブロック、0-「空気」)によって決定される単一ビット画像として表すことができます。 以下に、グリッドレベルが追加されたこのレベルの一部の拡大例を示します。

タイルのセット(タイルセット)
タイルセットは、マップに入力するために使用できるグラフィックイメージのセットです。 マリオタイルセットは非常に限定されており、いくつかのタイプのブロックと「装飾」で構成されていますが、このセットにはタイルのタイプごとに多くの画像が含まれます。

隣人を評価する
マップ上の特定のポイントに配置する必要があるタイルを決定するには、そのポイントのすぐ隣を調べる必要があります(今のところ、斜めに隣を無視します)。 if / else-ifから大きな構造を作成して、可能なすべての隣接の組み合わせを処理しないように、各方向に値を割り当てるシステムを使用します。

各ポイントの値は、その近傍を調べて、石が存在するそれらの値を追加することで見つけられます。 たとえば、調査対象ポイントの隣人も上から石で満たされている場合、値1が割り当てられます。隣人が上および下から石で満たされている場合、ポイントには値1 + 4、つまり5が割り当てられます。
割り当てられた方向の値は、2進数の位置の値と同じであることに気付くかもしれません。これは驚くことではありません。両方のタイプの値は、石または「空気」)。
これは、すべてのタイルの値が入力されたマップセグメントです。 これがどのように機能するかを理解するために、タイルのペアの値を手動で計算してみることができます。

タイル追加
画像に表示されるタイルセットの配置方法は偶然ではありません。各タイルが値を割り当てるマップタイルに対応するように配置されています。 マップのすべてのポイントに値を割り当てたら、タイルセットで値を探し、このポイントに適切なタイルを配置します。

いいね!
進む
パート1:「空気」を取り除く
上記の例は、吊り下げプラットフォームでうまく機能しますが、実際には2種類のタイルを完全に処理するわけではありません。
プラットフォーマーの代わりに、2種類のタイル(草と水)がある平面図の2次元戦略に取り組んでいると想像してください。 この場合、プラットフォームのゲームのように、タイル画像はマップの各ポイントに存在し、その中に空の場所はありません。 これは、適切なタイルを決定するために、マップ上の各ポイントがその近隣に基づいて生成された値を持つ必要があることを意味します。
以前とまったく同じ近隣査定システムを使用できますが、ポイントを調べるときに草または水の中にあるものを判断できる方法が必要です。 これは実装が非常に簡単です。他の値と同じパターン「2のn乗」を使用して、ポイント自体にもう1つの値を追加するだけです。

水がある場合は値にポイントを追加しますが、草がある場合は追加しないことを決めましょう。 つまり、すべての面で草に囲まれた草タイルの値は0です。上下に水がある草タイルの値は1 + 8 = 9です。すべての面で草に囲まれた水タイルの値は16です。水があるすべての側面から、1 + 2 + 4 + 8 + 16 = 31の値を持ちます
パート2:変動性を追加する
他のタイプの救済の処理を提供する方法は?
たとえば、トップビューゲームでは、水、草、森林の3種類の地形があります。 私たちはすでに水と草の境界を処理しています。今、水と森の境界、および草と森の処理方法を学ぶ必要があります。
以前は、各隣接位置(草または水)のタイルに2つのオプションがあったため、 バイナリシステムを使用しました。 現在、3つのオプションがすでにあるため、 3進システムを使用する必要があります。 新しい計算システムに合わせて、近隣の評価システムを変更する必要があります。

バイナリシステムでは、テンプレート「2のn乗」が使用され、新しいシステムでは、テンプレート「3のn乗」が使用されます。
三元系では、各位置に3つの状態があります:草、水、森林、または0、1、2。草が現在のポイントにある場合、値を無視します(0を掛けます)。 ポイントに水がある場合、設定値を追加します(1倍します)。 フォレストの場合、値を2倍します(2倍します)。
つまり、上と右に水がある森林タイルの場合、下は森林で、左は草です:81 * 3 + 1 * 2 + 3 * 1 + 9 * 3 + 27 * 0 = 275
ご覧のとおり、この段階では、カードと3種類の地形のすべての組み合わせをカバーするために、324枚のタイル画像がすでに描画されている必要があります。 手動で作業する場合、これには非常に長い時間がかかります。 非常に多くの組み合わせを作成するために、少なくとも部分的に自動化された方法を検討することを強くお勧めします。
もちろん、同じ方法で、システムをより多くの地形タイプに拡張できますが、タイル画像の数は大幅に増加します。 したがって、どのタイルを互いに隣接させるかについて制限を課すことをお勧めします。 たとえば、森林と水のタイルが互いに接することができない場合、上記の例では、数百枚のタイル画像が少なくて済みます。