Cara Menggunakan Tile Bitmasking ke Auto-Tile Layout Level Anda
() translation by (you can also view the original English article)
Membuat visual yang menarik dan berbagai macam variasi tileset adalah proses yang memakan waktu, tetapi hasilnya tidak sia-sia. Namun, bahkan setelah membuat seninya, Anda masih harus menggabungkan itu semua bersama-sama dalam level Anda!
Anda dapat menempatkan setiap tile, satu per satu, dengan tangan — atau, Anda dapat mengotomatisasi proses dengan menggunakan bitmasking, sehingga Anda hanya perlu Menggambar bentuk Medan.
Apa itu Tile Bitmasking?



Tile bitmasking adalah metode yang secara otomatis memilih sprite sesuai dari tileset yang didefinisikan. Hal ini memungkinkan Anda untuk menempatkan tile generik pengganti di Medan mana saja yang muncul bukan menempatkan satu-satu yang berpotensi besar pilihan dari berbagai jenis tile tertentu yang Anda inginkan.
Lihat video ini untuk demonstrasi:
(Anda dapat men-download demo dan file sumber dari GitHub repo.)
Ketika berhadapan dengan beberapa jenis Medan, jumlah variasi yang berbeda dapat melebihi 300 tile atau lebih. Gambar sprite yang banyak berbeda ini jelas merupakan suatu proses yang memakan waktu, tetapi tile bitmasking memastikan bahwa tindakan penempatan tile ini cepat dan efisien.
Dengan implementasi bitmasking yang statis, peta akan dihasilkan pada saat runtime. Dengan beberapa tweak kecil, Anda dapat memperluas bitmasking agar memungkinkan ubin dinamis berubah selama permainan. Dalam tutorial ini, kita akan membahas dasar-dasar tile bitmasking sambil mengerjakannya kita menuju implementasi yang lebih rumit yang menggunakan sudut tile dan beberapa jenis Medan.
Bagaimana Tile Bitmasking Bekerja
Ikhtisar
Tile bitmasking adalah semua tentang menghitung nilai numerik dan menugaskan sebuah sprite yang spesifik berdasarkan nilai. Setiap tile memandang pasangan tile untuk menentukan mana sprite dari set untuk menetapkan dirinya sendiri.
Setiap sprite di tileset diberi nomor, dan proses bitmasking kembali sesuai dengan nomor posisi sebuah sprite di tileset. Pada saat runtime, bitmasking prosedur dilakukan, dan setiap tile diperbarui dengan sprite yang sesuai.



Lembar sprite di atas terdiri dari Medan tile dengan semua konfigurasi perbatasan. Angka-angka pada setiap ubin mewakili nilai bitmasking, yang kita akan pelajari bagaimana menghitung pada bagian berikutnya. Untuk saat ini, sangat penting untuk memahami bagaimana nilai bitmasking berkaitan dengan Medan tileset. Sprite disusun berurutan sehingga nilai 0
bitmasking kembali ke sprite pertama, semua mengarah ke nilai 15
yang mengembalikan sprite ke 16.
Menghitung Nilai Bitmasking
Menghitung nilai relatif ini sederhana. Dalam contoh ini, kami menganggap jenis Medan tunggal dengan tanpa potongan-potongan sudut.
Setiap tile memeriksa keberadaan ubin di Utara, Barat, Timur dan Selatan, dan masing-masing cek kembali Boolean, dimana 0
melambangkan ruang kosong dan 1
menandakan adanya Medan tile lain.
Hasil Boolean ini kemudian dikalikan dengan nilai directional biner dan ditambahkan ke total berjalan dari nilai bitmasking-lebih mudah untuk memahami dengan beberapa contoh:
4-bit Directional Values
- Utara = 20 = 1
- Barat = 21 = 2
- Timur = 22 = 4
- Selatan = 23 = 8



Kotak hijau pada gambar di atas menunjukkan ubin Medan menghitung kami. Kita mulai dengan memeriksa untuk ubin ke utara. Tidak ada tile lain di sebelah utara, sehingga Boolean cek kembali nilai 0
. Kita kalikan 0 nilai terarah untuk Utara, 20 = 1, memberikan kita 1*0 = 0
.
Untuk Medan tile dikelilingi seluruhnya oleh ruang kosong, setiap Boolean check kembali 0
, mengakibatkan 4-bit Bilangan Biner 0000
atau 1*0 + 2*0 + 4*0 + 8*0 = 0
. Ada 16 total kemungkinan kombinasi, dari 0 sampai 15, sehingga sprite ke1 di tileset akan digunakan untuk mewakili jenis Medan tile dengan nilai 0
.



0001
, atau 1*1 + 2*0 + 4*0 + 8*0 = 1
. Sprite ke2 di tileset akan digunakan untuk mewakili jenis Medan dengan nilai 1
.


Medan tile berbatasan dengan tile ke utara dan tile untuk Timur kembali nilai biner 0101
, atau 1*1 + 2*0 + 4*1 + 8*0 = 5
. Sprite 6 di tileset akan digunakan untuk mewakili jenis Medan dengan nilai 5
.



Medan tile berbatasan dengan ubin ke Timur dan tile untuk Barat returns nilai biner 0110
, atau 1*0 + 2*1 + 4*1 + 8*0 = 6
. Sprite 7 di tileset akan digunakan untuk mewakili jenis Medan dengan nilai 6
.
Menugaskan Sprite untuk Tile
Setelah menghitung nilai tile bitmasking, kami menetapkan sprite sesuai dari tileset. Langkah terakhir ini dapat dilakukan secara real time sebagai beban peta, atau hasilnya dapat disimpan dan dimuat ke editor tile pilihan Anda untuk diedit lebih lanjut.



Angka di sebelah kiri mewakili 4-bit, single-terrain tileset seperti itu akan muncul secara berurutan pada lembar tile. Di sebelah kanan menggambarkan bagaimana tile yang terlihat dalam game setelah mereka ditempatkan menggunakan prosedur bitmasking. Setiap tile ditandai dengan nilai bitmasking untuk menunjukkan hubungan antara urutan tile pada lembar tile dan posisinya dalam permainan.
Sebagai contoh, mari kita periksa tile di sudut kanan atas angka di sebelah kanan. Tile ini berbatasan dengan tile di Barat dan Selatan. Boolean cek kembali nilai biner 1010
, atau 1*0 + 2*1 + 4*0 + 8*1 = 10
. Nilai ini sesuai dengan sprite ke 11 dalam lembar tile.
Kompleksifitas Tileset
Jumlah yang diperlukan directional cek Boolean tergantung pada kompleksitas pada tileset Anda. Dengan mengabaikan potongan-potongan sudut, Anda dapat menggunakan solusi 4-bit sederhana ini yang hanya memerlukan empat cek biner yang terarah.
Tapi apa yang terjadi ketika Anda ingin membuat medan lebih menarik? Anda akan perlu berurusan dengan adanya sudut tile, yang meningkatkan jumlah sprite dari 16 untuk 48. Contoh bitmasking 8-bit berikut memerlukan delapan Boolean directional cek per tile.
Bitmasking 8-bit dengan Sudut Tile
Untuk contoh ini, kami menciptakan tileset atas ke bawah yang menggambarkan Medan dekat lautan. Dalam kasus ini, laut kami ada lapisan dibawah tile Medan. Hal ini memungkinkan kita untuk menggunakan solusi medan-tunggal, sementara tetap mempertahankan ilusi bahwa dua jenis Medan bertabrakan.
Setelah permainan berjalan dan prosedur bitmasking lengkap, sprite tidak pernah berubah. Ini adalah implementasi yang mulus, bitmasking statis dimana semuanya terjadi sebelum pemain pernah melihat tiles.
Memperkenalkan Sudut Tiles
Kami ingin daerahnya harus lebih menarik daripada solusi 4-bit sebelumnya, sehingga potongan-potongan sudut diperlukan. Tambahan visual ini sedikit kompleks membutuhkan jumlah eksponensial pekerjaan tambahan untuk seniman, programmer, dan game itu sendiri. Dengan perluasan pada apa yang kita pelajari dari solusi 4-bit, kita dapat dengan cepat memahami cara pendekatan solusi 8-bit.



Berikut ini adalah lembar lengkap sprite untuk tiles sisi laut Medan kami. Apakah Anda memperhatikan sesuatu yang aneh tentang jumlah tiles? Contoh 4-bit dari 24 = 16 sebelumnya menghasilkan tiles, jadi contoh 8-bit ini pasti menghasilkan 28 = 256 ubin, namun ada jelas lebih sedikit daripada yang ada.
Memang benar bahwa hasil prosedur bitmasking 8-bit ini dalam 256 nilai biner yang mungkin tidak setiap kombinasi memerlukan tiles yang sepenuhnya unik. Contoh berikut akan membantu menjelaskan bagaimana 256 kombinasi dapat diwakili oleh hanya 48 ubin.
8-bit Directional Values
- Barat Laut = 20 = 1
- Utara = 21 = 2
- Timur Laut = 22 = 4
- Barat = 23 = 8
- Timur = 24 = 16
- Barat Daya = 25 = 32
- Selatan = 26 = 64
- Tenggara = 27 = 128



Sekarang kami membuat delapan cek directional Boolean. Pusat tile atas dibatasi oleh tile di Utara, Utara-Timur, dan Timur, jadi ini memeriksa Boolean mengembalikan biner nilai 00010110
atau 1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*0 + 64*0 + 128*0 = 22
.



Tile di sebelah kiri di atas mirip dengan tile sebelumnya, tetapi sekarang juga berbatasan dengan tile di barat selatan dan Tenggara. Ini memeriksa directional Boolean harus mengembalikan nilai biner 10110110
, atau 1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*1 + 64*0 + 128*1 = 182
.
Nilai ini berbeda dari tile sebelumnya, tetapi tile kedua sebenarnya akan identik secara visual, sehingga menjadi berlebihan.
Untuk menghilangkan redudansi, kita menambahkan kondisi tambahan untuk memeriksa arah Boolean Kami: saat memeriksa keberadaan berbatasan dengan sudut tile, kita juga harus memeriksa tetangga tile di empat arah Kardinal (langsung di Utara, Timur, Selatan, atau Barat).
Sebagai contoh, tile ke utara-timur tile neighbored yang sudah ada, sedangkan tike untuk Barat dan Selatan-Timur tidak. Ini berarti bahwa Barat dan Selatan-Timur tile tidak termasuk dalam perhitungan bitmasking.
Dengan kondisi baru ini, Boolean ini memeriksa kembali nilai biner 00010110
atau 1*0 + 2*1 + 4*1 + 8*0 + 16*1 + 32*0 + 64*0 + 128*0 = 22
seperti sebelumnya. Sekarang Anda dapat melihat bagaimana kombinasi 256 dapat diwakili oleh hanya 48 tile.
Urutan Tile
Masalah lain yang mungkin Anda perhatikan bahwa nilai-nilai yang dihitung dengan prosedur bitmasking 8-bit tidak berkorelasi dengan tile berurutan dalam lembar sprite. Hanya ada 48 ubin, tetapi nilai yang dihitung mungkin berkisar dari 0 hingga 255, sehingga kita tidak lagi dapat menggunakan nilai yang dihitung sebagai rujukan langsung ketika meraih sprite yang sesuai.
Apa yang kita butuhkan, karena itu, adalah struktur data berisi daftar nilai-nilai yang dihitung dan nilai-nilai tile mereka sesuai. Bagaimana Anda ingin menerapkan ini terserah Anda, tetapi ingat bahwa urutan di mana Anda memeriksa disekitar tile menentukan urutan di mana tile Anda harus ditempatkan dalam lembar sprite.
Untuk contoh ini, kami memeriksa perbatasan tile dalam urutan sebagai berikut: Barat laut, Utara, Timur laut, Barat daya, Timur, Barat, Selatan, Tenggara.
Di bawah ini adalah nilai set lengkap bitmasking hubungannya dengan posisi tile di kami sprite lembar (merasa bebas untuk menggunakan nilai-nilai ini dalam proyek Anda untuk menghemat waktu):
1 |
{ 2 = 1, 8 = 2, 10 = 3, 11 = 4, 16 = 5, 18 = 6, 22 = 7, 24 = 8, 26 = 9, 27 = 10, 30 = 11, 31 = 12, 64 = 13, 66 = 14, 72 = 15, 74 = 16, 75 = 17, 80 = 18, 82 = 19, 86 = 20, 88 = 21, 90 = 22, 91 = 23, 94 = 24, 95 = 25, 104 = 26, 106 = 27, 107 = 28, 120 = 29, 122 = 30, 123 = 31, 126 = 32, 127 = 33, 208 = 34, 210 = 35, 214 = 36, 216 = 37, 218 = 38, 219 = 39, 222 = 40, 223 = 41, 248 = 42, 250 = 43, 251 = 44, 254 = 45, 255 = 46, 0 = 47 } |
Beberapa Jenis Medan
Semua contoh kami sebelumnya menganggap jenis Medan tunggal, tapi bagaimana jika kami memperkenalkan Medan kedua ke dalam persamaan? Kita perlu solusi 5-bit bitmasking, dan kita perlu menentukan jenis dua Medan kami. Kita juga perlu untuk menetapkan nilai ke pusat tile yang dianggap hanya di bawah kondisi tertentu. Ingat bahwa kita bukan lagi menghitung untuk "tempat kosong" seperti pada contoh sebelumnya; tile harus sekarang dikelilingi oleh tile lain di semua sisi.



Gambar di atas menunjukkan contoh dengan dua jenis Medan dan tidak ada sudut tile. Tipe 1 selalu kembali nilai 0
setiap kali itu terdeteksi selama pemeriksaan arah; nilai tile center dihitung dan digunakan hanya jika Medan tipe 2.
Tile pusat dalam contoh diatas dikelilingi oleh daerah tipe 2 di Utara, Barat, dan Timur, dan oleh Medan tipe 1 di Selatan. Tile center adalah tipe daerah 1, jadi itu tidak dihitung. Ini memeriksa Boolean mengembalikan nilai biner 00111
, atau 1*1 + 2*1 + 4*1 + 8*0 + 16*0 = 7
.



Pada contoh ini, tile pusat kami adalah Medan tipe 2, sehingga akan dihitung dalam perhitungan. Tile pusat dikelilingi oleh daerah tipe 2 di utara dan Barat. Juga dikelilingi oleh daerah tipe 1 di Timur dan Selatan. Ini memeriksa Boolean mengembalikan nilai biner 10011
, atau 1*1 + 2*1 + 4*0 + 8*0 + 16*1 = 19
.
Implementasi Dinamis
Perhitungan bitmasking juga dapat dilakukan selama permainan, memungkinkan untuk perubahan penempatan dan penampilan tile real-time Hal ini berguna untuk perubahan Medan serta permainan yang memungkinkan untuk kerajinan dan membangun. Prosedur awal bitmasking wajib bagi semua tile, tetapi perhitungan dinamis setiap tambahan hanya dapat dilakukan bila benar-benar diperlukan. Sebagai contoh, genteng medan hancur akan memicu perhitungan bitmasking hanya untuk sekitaran tile.
Kesimpulan
Tile bitmasking adalah contoh sempurna dari membangun sistem kerja untuk membantu Anda dalam pengembangan game. Ini bukanlah sesuatu yang secara langsung mempengaruhi pengalaman pemain; Sebaliknya, metode ini mengotomatisasi sebagian memakan waktu mendesain level menyediakan manfaat yang berharga untuk pengembang. Sederhananya: tile bitmasking adalah cara cepat untuk membuat game melakukan pekerjaan kotor Anda, membiarkan Anda berfokus pada tugas-tugas yang lebih penting.