Setelah menghabiskan waktu hari ini untuk menuliskan beberapa catatan mengenai penerapan dinding ke dalam permainan berbasis ubin saya, tiba-tiba saya menyadari itu tidak akan sesederhana yang saya bayangkan sebelumnya. Sementara tahap pekerjaan saya saat ini bahkan tidak dekat dengan benar-benar membuat kode yang berhubungan dengan dinding, saya telah datang dengan tiga cara berbeda untuk melakukannya. Saat ini saya tidak yakin ide mana yang paling berhasil, dan apakah saya melewatkan sesuatu atau tidak.
Penting: karakter BISA berdiri di atas ubin yang memiliki dinding, terlepas dari bentuknya.
Hal umum untuk ketiga varian: tilemap akan "disimpan" dalam wadah berbasis std :: vector (atau serupa) berdimensi tunggal. Alasan untuk itu (luar biasa) dijelaskan dalam jawaban untuk pertanyaan yang berbeda.
Kelas penampung dalam game berbasis ubin.
Kembali ke tembok.
A) Pendekatan sederhana.
Tidak ada yang mewah di sini. Setiap ubin-wadah tidak hanya dapat menampung karakter, tetapi satu atau beberapa objek Dinding, yang melekat pada tepi di dalam ubin.
Kelebihan: mudah diimplementasikan, tidak ada perubahan di mesin. Cons: Dua hal. Satu - mungkin hanya di kepala saya, tetapi beberapa kombinasi hanya terlihat jelek. Kedua - pendekatan ini memungkinkan untuk membuat dinding ganda dari dua ubin yang berdekatan. Bangunan akan menjadi bagian penting dari gim ini, dan dinding ganda memungkinkan para pembangun untuk tidak lagi meningkatkan materi dinding melalui sarana gim, dan hanya mencapai peningkatan daya tahan dengan menggandakan dinding yang ada. Itu tidak diinginkan. Tentu, saya bisa memasukkan prosedur yang melarang tembok ganda, tetapi akan terasa buruk.
B) Pendekatan cerdas (?).
Alih-alih membiarkan para pemain mendobel dinding seluruh peta, saya akan mengalahkan mereka. Setiap dinding memiliki dua bagian yang melekat pada tepi ubin dari dalam. Jadi, untuk membuat satu "unit Wall" saya harus membuat dua objek Half-Wall di dua ubin yang berdekatan.
Pro: Ini simetris !!! Juga, tidak ada perubahan signifikan dari spesifikasi mesin saat ini yang diperlukan. Cons: Lebih banyak kerumitan, lebih banyak objek, dan, tentu saja, "topi". Seperti yang Anda lihat pada gambar, pada dasarnya sudut akan menangisi objek "topi". Saya sebenarnya asyik dengan itu, tidak begitu sulit untuk ditambahkan. Hei, saya sudah punya rencana untuk kolom tipis yang terbuat dari empat topi yang terhubung. Manis. Namun, saya masih khawatir tentang kemungkinan masalah Bidang Pandang dan Lini Penglihatan.
C) Varian total perbaikan.
Atau, saya bisa membuat batas dan sudut sebagai wadah terpisah untuk objek game. Seperti itu.
Pro: Bahkan tidak yakin. Yah, itu mudah. Pastinya. Cons: Ini akan membutuhkan perombakan. Syukurlah, bukan kode, tetapi mentalitas mekanik permainan saat ini - itu sudah pasti. Manfaatnya tidak begitu jelas. Juga, pendekatan ini membutuhkan lebih banyak wadah daripada dua yang sebelumnya. Matematika pengindeksan juga akan sedikit sakit.
Jadi di sini kita memilikinya - tiga cara berbeda membuat dinding antara ubin. Jika ada alternatif di luar sana - saya akan senang untuk memeriksanya. Jika ada manfaat / kelemahan dari salah satu pendekatan yang tidak saya lihat - tunjukkan.
sumber
Jawaban:
Saya akan menggunakan metode Anda 'B'.
Untuk menghindari kebutuhan 'penutup', cukup rentangkan setiap dinding "1/2 ketebalan dinding" di kedua arah. Ini akan menciptakan dinding yang tumpang tindih tempat mereka bertemu, tetapi diagram Anda sudah menunjukkan ini bukan masalah.
Jadi, dalam Metode 'B', Pic # 3, dinding horizontal akan memanjang ke kiri sedikit, dan dinding vertikal akan memanjang sedikit.
[Saya baru di sini, baru saja mendaftar. Apakah saya kehilangan sesuatu, karena saya tidak dapat melihat tombol 'Tambahkan Komentar' ke posting asli Anda. Apakah itu hak istimewa orang-orang dengan reputasi lebih tinggi? Atau apakah saya mengabaikan yang sudah jelas? Maaf karena menambahkan ini sebagai 'jawaban'.]
sumber
Anda mencatat bahwa karakter dapat berdiri di atas ubin yang berisi dinding, tetapi apakah Anda pernah menganggap setiap ubin sebagai dinding itu sendiri? Bahkan setengah ubin sebagai dinding secara horizontal atau vertikal?
Kelebihan: Perhitungan dan penempatan sepele, tabrakan sepele di mana semua perhitungan dan tabrakan hanya didasarkan pada koordinat penempatan dinding.
Cons: Ini dapat memengaruhi seluruh implementasi, kode, dan grafik Anda. Anda juga tidak ingin sepenuhnya meninggalkan metode Anda, Anda masih menginginkan kasus-kasus khusus di mana hanya sebagian ubin yang ada di dinding (Tautkan ke Masa Lalu dengan tebing).
Ini adalah bagaimana saya akan mendasarkan implementasi saya, maju, mengetahui bahwa saya selalu dapat mereferensikan ubin dan melakukan perhitungan tergantung pada lokasi karakter saya dan jenis ubin itu.
Sebuah tembok kastil, aku hanya bisa melakukan perhitungan dari tengah menggambar kotak yang aku tidak bisa lewati atau jika itu adalah batu bulat aku bisa melakukan perhitungan yang sama dari pusat tetapi sebagai lingkaran sehingga karakterku bisa bergerak seperti itu bulat.
sumber
Maaf untuk mengatakan tetapi cara ketiga benar-benar cara untuk berpikir, yah, Anda sudah memiliki kemampuan untuk melakukan itu jadi mari kita lanjutkan dan pikirkan dua lainnya!
Masalahnya adalah bahwa dinding adalah nol lebar, dua dimensi (tinggi * panjang, dalam dunia 3D) memartisi dua kotak. Anda harus menganggapnya seperti itu tetapi Anda mungkin menggunakan solusi yang lebih sederhana seperti kapan membangun ruang bawah tanah Anda (terutama jika orang lain mungkin membuat bagian-bagian).
Tampaknya itu adalah permainan 2D Top-Down di mana dinding memiliki "lebar" sehingga mereka membutuhkan sudut itu (objek 'topi' Anda). Ini khusus 'grafis' jadi saya akan pergi dengan semacam:
Peta 2D dengan ubin (mis. Jenis ubin dan semacamnya).
Peta 2D dengan 2 dinding, mis. bawah dan kanan (dinding kiri akan menjadi 'dinding kanan' di ubin kiri dari yang ini).
+ Logika yang menarik semua dinding dan 'topi' dll.
Sehingga memisahkan logika dan grafik. Anda dapat melakukan "antarmuka" untuk menangani hal-hal seperti SetWall (ThisTile, LEFT, NOWALL) -> mengatur dinding kanan ubin kiri ThisTile ke "NOWALL" ...
Mungkin ini tampak buram tetapi masalahnya adalah Anda harus selalu mencoba untuk memiliki logika di satu sisi (data aktual, tanpa redundansi) dan di sisi lain 'gambar data' yang menghitung jika perlu 'cap' 'dll.
++
sumber