隣接するタイルに基づいてタイルを選択


10

タイルマップエディターで作業していて、隣接するタイルに基づいてタイルを自動的に選択する必要があります。たとえば、道路タイルを別の道路タイルの隣に配置する場合、2つは連続した道路を形成するように向きを合わせる必要があります。周辺に他の道路がある場合は、コーナータイルまたは交差点タイルを使用する必要があります。

誰かがこれを行うためのいくつかのアルゴリズムを推奨できますか?ゲームでは、8方向の正方形タイルマップを使用します。


ユーザーが新しいタイルを置くたびに、周囲の8つのタイルすべてを調べて、それに応じて新しいタイルの向きを調整できませんか?もちろん、方向やタイプなど、いくつかの追加情報を各タイルに保存する必要があります。
XiaoChuan Yu

周囲のタイルをすべて調べていますが、すべてのタイルの組み合わせを処理する方法がわかりませんでした。たとえば、7つのタイルから選択できます(水平、垂直、4つのコーナー、および十字)。複雑なswitchステートメントを使用することを考えましたが、それは間違っていました。
alekop

回答:


18

多分これはそれが通常行われている方法です。すべての可能な向きで道路タイルを表すさまざまなタイルのリストがあります。左から右、四隅すべて、上から下など。次に、すべてのタイルにそれぞれ1バイトのインデックスを付けます。8ビット、各方向に1つ。これは、ハッシュマップまたはファイル名である可能性があります...ただし、これを実行したい場合。

だからあなたはこれを持っています:

ここに画像の説明を入力してください

上記のタイルのバイトコードは00000000です。次に、左から右(または右から左)に進むタイルは次のようになります。

ここに画像の説明を入力してください

そのタイルのバイトコードは10001000または136です。別の例として、3方向の交差を見てみましょう。

ここに画像の説明を入力してください

そのタイルのバイトコードは10101000です。

たぶん私がどこへ行くのかわかるでしょう。接続を表すバイトにビット位置を設定します。これは、以前見た大きなif / elseチェーンを実行するよりもはるかに優れています。タイルを配置する場合は、その周りのタイルを調べて、途中にバイトを作成します。道路のあるタイル(または接続しようとしているもの)には1を設定し、道路のないタイルには0を設定します。完了すると、必要な正確なタイルのバイトコードが得られます。

アセットを作成するときは、回転して正しいバイトコードを割り当てるだけで、多くのアセットを再利用できます。

編集:画像を更新して、より簡単になりました。はい、それらは以前よりも優れています。


非常に素晴らしい!シンプルで効率的。私が理解していない唯一のことは、それらのビットマスクをどのように取得しているのかです。たとえば、3と7の数字から17のビットマスクをどのように取得していますか?
alekop

気にしないで、私はあなたがやっていることを確認します。ビット3と7を設定していますが、右ではなく左から数えています。
alekop

ああ、なんて恥ずかしいことだ。私のエンディアンネスをすべて取り違えました。それは私がそれを修正する事故でした!
MichaelHouse

すばらしい、今私のコメントは意味がありません!:p冗談です。回答ありがとうございます。それがまさに私が探していたものです。
alekop

1
良い説明。実際のコードとタイル解像度で同じテクニックをカバーするブログ投稿があります:kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

詳細については、この便利なページをご覧になることをお勧めします。これは、実行していることのほぼすべての側面と、いくつかの最適化の可能性について詳しく説明しているためです。http//www.angryfishstudios.com / 2011/04 /ビットマスクの冒険/

tldrは、隣接する各セルをクエリし、その組み合わせをビットフィールド/バイトに格納してから、0〜255の数値を0〜47の値に変換するマップに渡します。これは、一意の画像に対応します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.