Pilih ubin berdasarkan ubin yang berdekatan


10

Saya sedang mengerjakan editor peta ubin, dan saya harus memilih ubin secara otomatis, berdasarkan ubin yang berdekatan. Misalnya, ketika menempatkan ubin jalan, di sebelah ubin jalan lain, keduanya harus berorientasi sehingga mereka membentuk jalan yang berkelanjutan. Jika ada jalan lain di sekitarnya, kita mungkin perlu menggunakan ubin sudut atau persimpangan.

Adakah yang bisa merekomendasikan beberapa algoritma untuk melakukan ini? Permainan ini menggunakan peta ubin persegi 8-arah.


Tidak bisakah Anda memeriksa semua 8 ubin di sekitarnya setiap kali pengguna meletakkan ubin baru, dan menyesuaikan ubin baru sesuai? Tentu saja Anda harus menyimpan beberapa info tambahan pada setiap ubin seperti orientasi dan jenis.
XiaoChuan Yu

Saya memeriksa semua ubin di sekitarnya, tetapi saya tidak tahu bagaimana menangani semua kombinasi ubin. Misalnya, Anda memiliki tujuh petak yang mungkin untuk dipilih (horizontal, vertikal, empat sudut, dan tanda silang). Saya berpikir untuk menggunakan statement switch yang rumit, tetapi itu terasa salah.
alekop

Jawaban:


18

Mungkin ini yang biasanya dilakukan. Anda memiliki daftar petak berbeda yang mewakili petak jalan di semua orientasi yang dimungkinkan. Kiri ke kanan, keempat sudut, atas ke bawah, apa pun. Sekarang Anda akan mengindeks semua ubin dengan byte masing-masing. 8 bit, satu untuk setiap arah. Ini bisa berupa hashmap atau dengan nama file ... namun Anda ingin melakukan ini.

Jadi Anda punya ini:

masukkan deskripsi gambar di sini

Kode byte untuk ubin di atas adalah 00000000 . Maka ubin Anda yang bergerak dari kiri ke kanan (atau kanan ke kiri) adalah seperti ini:

masukkan deskripsi gambar di sini

Kode byte untuk ubin itu adalah 10001000 , atau 136. Sebagai contoh lain, mari kita lihat persimpangan tiga arah:

masukkan deskripsi gambar di sini

Kode byte untuk ubin itu adalah 10101000 .

Anda mungkin melihat ke mana saya pergi. Anda mengatur posisi bit dalam byte yang mewakili koneksi. Ini jauh lebih baik daripada mencoba melakukan rantai besar jika / selain yang pernah saya lihat sebelumnya. Saat Anda mencari untuk menempatkan ubin, periksa ubin di sekitarnya dan buat byte di sepanjang jalan. Tetapkan 1's untuk ubin yang memiliki jalan (atau apa pun yang Anda ingin hubungkan) dan 0's untuk ubin yang tidak. Setelah selesai, Anda akan memiliki kode byte untuk ubin persis yang Anda butuhkan.

Perhatikan bahwa saat membuat aset, Anda dapat menggunakan kembali banyak dari aset tersebut hanya dengan memutar dan menetapkan kode byte yang benar.

Sunting : Gambar yang diperbarui menjadi kurang jelek. Ya itu lebih baik dari sebelumnya.


Sangat bagus! Sederhana dan efisien. Satu-satunya hal yang saya tidak mengerti adalah bagaimana Anda mendapatkan bitmask itu. Misalnya bagaimana Anda mendapatkan bitmask 17 dari angka 3 dan 7?
alekop

Sudahlah, aku mengerti apa yang kamu lakukan. Anda mengatur bit 3 dan 7, tetapi Anda menghitung dari kiri, bukan kanan.
alekop

Oh wow, betapa memalukannya. Semua Endianness saya campur aduk. Itu kecelakaan aku akan memperbaikinya!
MichaelHouse

Hebat, sekarang komentar saya tidak masuk akal! : p Hanya bercanda, terima kasih atas jawaban Anda. Itulah tepatnya yang saya cari.
alekop

1
Penjelasan yang bagus. Saya punya posting blog yang membahas teknik yang sama dengan kode aktual dan resolusi ubin: kitsu.github.io/2016/07/18/roguelike-project-05
kitsu.eb

3

Saya akan merekomendasikan Anda melihat halaman praktis ini untuk informasi lebih lanjut, karena ia menjelaskan secara rinci tentang hampir setiap aspek dari apa yang Anda lakukan, serta beberapa optimasi potensial: http://www.angryfishstudios.com / 2011/04 / adventure-in-bitmasking /

Tldr adalah bahwa Anda kueri setiap sel yang berdekatan dan menyimpan kombinasi dalam bitfield / byte, kemudian meneruskannya melalui peta yang mengubah angka dari 0 ~ 255 menjadi nilai dari 0 ~ 47, yang sesuai dengan gambar unik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.