Saya menulis mesin isometrik di c ++. Saya memutuskan untuk mengambil pendekatan yang lebih realistis dan membuat dinding menempati ruang antara dua ubin, bukan satu ubin utuh, seperti yang ditunjukkan pada gambar di bawah ini (seperti di The Sims).
Masalah saya adalah bahwa saya tidak tahu bagaimana cara menyimpan data terkait peta ubin dalam sesuatu yang bukan kisi. Dalam situasi ini, saya kira saya harus membuatnya menjadi A * friendly, sehingga akan ada node dan tepi antara ubin yang tidak dibagi oleh dinding. Berikut adalah gambar lain yang menunjukkan apa yang ingin saya capai:
Jadi inilah pertanyaannya:
Bagaimana seharusnya saya:
- menyimpan seluruh peta, baik ubin dan dinding
- mengoptimalkannya untuk rendering
- menggunakannya untuk A * dan algoritma lain yang agak mudah diterapkan pada grid sederhana tetapi sekarang menggunakan dinding (tepi) untuk menentukan visibilitas, tabrakan dll?
Jawaban:
Saya mulai dengan sistem koordinat - koordinat untuk lokasi grid adalah (x, y) tetapi sebagai Krom disebutkan dalam jawaban yang berbeda, untuk dinding bisa ada dua dinding untuk setiap lokasi grid. Itu mengarah ke sistem koordinat kedua, untuk tepi antara ubin . Dalam artikel ini saya menggunakan Barat dan Selatan sehingga ujungnya bisa (x, y, Barat) atau (x, y, Selatan), tetapi Anda bisa memilih dua selama Anda konsisten.
Kedua sistem koordinat (ubin kotak dan tepi) saling terkait. Anda ingin bertanya: empat sisi mana yang mengelilingi ubin?
Untuk merintis jalan, A * ingin tahu ubin mana yang bertetangga (B) dari ubin saat ini (A). Alih-alih mengembalikan keempat ubin yang berdekatan, Anda dapat memeriksa keempat tepi. Anda menyertakan ubin B sebagai tetangga hanya jika tidak ada dinding antara A dan B.
Alih-alih menyimpan dua dinding untuk setiap ubin, seperti yang disarankan Krom, saya biasanya menyimpan dinding dalam struktur data yang terpisah: seperangkat koordinat tepi. Ketika A * ingin tahu apakah B adalah tetangga dari A, saya akan memeriksa apakah edge itu ada di set. Jika ya, maka saya tidak mengembalikan B.
Anda mungkin tidak membutuhkan ini untuk A *, tetapi untuk hal-hal lain Anda mungkin ingin tahu untuk setiap sisi, yang menghubungkan dua ubin:
Lihat bagian “Algoritma” halaman untuk perhitungan untuk dua operasi ini.
Perhatikan juga: untuk beberapa jenis peta, Anda sebenarnya ingin menyimpan empat sisi per kotak petak, sehingga Anda dapat mendukung gerakan satu arah.
sumber
Di setiap ubin Anda dapat menyimpan dinding yang ada di Utara dan Timur. Dengan begitu setiap ubin hanya perlu menyimpan 2 boolean (atau int, jika Anda ingin menyimpan jenis dinding). Kekurangannya adalah bahwa ubin di sepanjang tepi Selatan dan Barat tidak dapat memiliki dinding di Selatan dan Barat kecuali jika Anda menambahkan satu baris lagi ubin tersembunyi yang akan memilikinya.
sumber
Di setiap ubin, itu bisa menyimpan tetangga (atau konektivitas) yang memiliki akses. Mungkin sebagai bitmap. Dindingnya adalah tempat dua ubin yang berdekatan tidak terhubung. Ini sangat ramah dengan A *.
Pendekatan kedua adalah menyimpan konektivitas ubin sebagai enumerasi. Misalnya, ubin yang sepenuhnya terbuka adalah 0, ubin dengan dinding ke utara dan sisanya terbuka adalah 1, ubin dengan dinding di selatan dan sisanya terbuka adalah 2, dan seterusnya hingga Anda menutup semua kombinasi yang mungkin.
sumber
Semoga C # ini cocok untuk Anda - c ++ saya sangat berkarat:
Anda dapat menambahkan informasi khusus dinding ke kelas Dinding, informasi khusus ubin ke kelas Tile, dan selanjutnya memperbaiki kondisi dalam metode "CanGo". Misalnya, ketika dinding sebenarnya adalah pintu yang terkunci - katakanlah, kelas Pintu.
Untuk menggambar ini, Anda akan mulai dengan ubin sewenang-wenang - katakan ubin di tengah posisi kamera saat ini. Kemudian bergerak ke arah dan ke kiri kamera sesuai dengan ukuran ubin. Kemudian lakukan lintasan pertama dari node IMapFeature, gambar setiap dinding / ubin sesuai urutan.
A * akan bekerja pada struktur ini, meskipun Anda jelas membutuhkan beberapa modifikasi untuk menangani sesuatu seperti pintu yang terkunci.
Jika Anda mau, Anda juga bisa mempertahankan indeks spasial ubin, yang secara implisit akan mencakup dinding, untuk mengetahui ubin mana yang berada dalam batas kamera.
Anda masih hanya perlu memilih ubin awal dan jarak untuk melintasi berdasarkan ukuran ubin.
sumber