Saya mencari informasi tentang bagaimana orang menerapkan autotiling dalam game berbasis ubin mereka. Sejauh ini saya selalu mengimprovisasinya dengan banyak pernyataan "jika ... lain ..." yang sudah dikodekan, dan sekarang saya memutuskan bahwa inilah saatnya untuk menemukan solusi yang lebih elegan. Saya pergi mencari di internet untuk contoh implementasi autotiling dan diskusi tentang topik, tetapi saya hanya menghasilkan tiga artikel:
- http://www.codeproject.com/Articles/106884/Implementing-Auto-tiling-Functionality-in-a-Tile-M
- http://blog.rpgmakerweb.com/tutorials/anatomy-of-an-autotile
- http://web.archive.org/web/20130927193449/http://www.squidi.net/mapmaker/musings/m091016.php
(Terutama yang terakhir komprehensif dan sangat membantu.)
Saya juga telah melihat berbagai implementasi dan dokumentasi perpustakaan, yang mengimplementasikannya, misalnya, flixel: http://www.flixel.org/features.html#tilemaps
Sedihnya, semua solusi yang saya dapat temukan adalah persis seadanya dan seadanya, seperti apa yang saya mulai, dan hampir tidak pernah mencakup semua kasus yang mungkin.
Saya mencari contoh elegan implementasi autotiling yang bisa saya pelajari.
Saya tiba di sini dengan Googling masalah ini sendiri, membaca artikel yang ditautkan, dan menghasilkan solusi yang relatif ringkas yang menghasilkan 47 ubin. Ini membutuhkan 2x3 tileset untuk bahan autotiled seperti ini:
Dengan varian ubin tunggal di kiri atas, sudut dalam di kanan atas, dan empat ubin sudut luar di bagian bawah (Anda dapat mengenali pengaturan ini dari RPG Maker).
Caranya adalah memecah setiap ubin peta "logis" menjadi 4 ubin setengah untuk dirender. lebih jauh lagi, setengah ubin di ubin hanya dapat berada di posisi itu di ubin yang dihasilkan, sehingga ubin setengah kiri atas hanya dapat digunakan di posisi kiri atas.
Pembatasan ini berarti bahwa Anda hanya perlu memeriksa 3 tetangga ubin penuh per ubin setengah, bukan semua 8 ubin tetangga.
Saya mengimplementasikan ide ini dengan cepat untuk mengujinya. Berikut kode proof-of-concept (TypeScript):
Penjelasan:
A
adalah bagian kiri atas ubin,B
adalah kanan atas,C
adalah kiri bawah,D
adalah kanan bawah.edges
memegang bitmasks untuk masing-masing, sehingga kami hanya dapat mengambil info tetangga yang relevan.map*
adalah kamus yang memetakan negara tetangga ke indeks grafik pada gambar tileset (0..24)._tile
adalah ubin yang ditargetkan untuk autotiling.Bagaimanapun, berikut hasilnya (dengan hanya satu ubin, toh):
sumber
Saya membaca sebagian besar tautan dan meluangkan waktu untuk mencari solusi lain. Saya tidak tahu apakah ini baik atau tidak, tetapi untuk mensimulasikan perilaku ubin otomatis RPG Maker VX Ace (47 ubin) saya mulai melakukan sesuatu seperti ini:
Saya bukan seorang programmer dan bukan yang terbaik dengan algoritma matematika dan solusi 1, 2, 4, 8, 16, 32, 64, 128 Saya juga tidak terlalu suka.
Mungkin pendekatan saya setidaknya lebih baik dari itu.
sumber