Bagaimana cara menerapkan lampu & bayangan di tilemap 2d multi-layer?

11

Saya sedang dalam proses menulis permainan isometrik dari awal, dan saya ingin tahu bagaimana / jika saya bisa menambahkan cahaya dan bayangan.

Kode yang saya miliki sejauh ini dapat ditemukan di sini , tetapi harus cukup untuk mengetahui bahwa sekarang , peta adalah array 3d sederhana dari nilai true / false . Ini adalah foto lingkungan:Cuplikan layar tilemap multi-layer

Jika tilemap lapisan tunggal itu akan lurus ke depan. Saya bisa mengerti raycasting sederhana dalam 2d yang diperlukan.

Namun, mengingat bahwa peta saya memiliki ketinggian beberapa tingkat serta area seperti gua, saya tidak benar-benar tahu bagaimana cara melakukan bayangan meyakinkan untuk itu. Mungkin solusi per-blok adalah satu-satunya cara realistis?

Danie Clawson
sumber
Apakah Anda mencari pencahayaan yang dibuat sebelumnya atau dihasilkan secara dinamis? Apakah "area seperti gua" ditampilkan terpotong jika pemain masuk, atau apakah cahaya perlu mempertimbangkan langit-langit juga? Apakah Anda mengharapkan setiap ubin menjadi biner menyala / gelap, atau memiliki semacam nilai fraksional?
Anko
1
@Anko Saya lebih suka sesuatu yang fraksional, seperti 0 - 1.1 (untuk area yang terlalu terang seperti ledakan, dll), tetapi bisa saja hanya berbasis blok, tanpa interpolasi nyata atau semacamnya. Saya benar-benar ingin itu dinamis, dan mendukung banyak lampu. Dan sementara area "seperti gua" / beratap akan ditampilkan dipotong algo perlu mempertimbangkan blok tidak ditampilkan saat menghitung cahaya. Misalnya, jika Anda berjalan di rumah, balok atap akan menghilang, tetapi bagian dalamnya harus tetap teduh.
Danie Clawson
Jika Anda mencari solusi seperti itu dengan gua dan tinggi, sepertinya Anda tidak memiliki 2D. Anda mungkin mencari solusi 3D lengkap, bahkan jika kamera selalu melihat ke arah Utara-45º ke bawah. Anda harus melihat teknik seperti stensil-bayangan atau serupa.
Adrian Maire
Saya kedua @AdrianMaire Anda harus melakukan perhitungan 3d yang tepat tetapi membuat beberapa cara pintas jika tidak ada interpolasi di wajah-wajah "ubin". Jika Anda tidak melakukan interpolasi Anda mungkin bisa menggunakan sinar.
NeomerArcana
Saya tidak memiliki mindspace saat ini untuk mencernanya menjadi sebuah jawaban, tetapi saya hanya tersandung pada posting blog ini tentang penentuan garis pandang untuk medan ketinggian peta . Kedengarannya seperti apa yang Anda cari.
Anko

Jawaban:

1

Dapatkah saya merekomendasikan agar bayangan 2d berfungsi terlebih dahulu, bahkan jika itu hanya untuk level saat avatar Anda aktif Akan lebih mudah untuk mulai melihat kode seperti itu dan membuatnya berfungsi.

Saya telah menerapkan bayangan dalam peta ubin 2d dalam beberapa cara. Salah satu metode shadowcasting yang saya temukan dijelaskan oleh Eric Lippert di Microsoft bekerja dengan sangat baik.

Dan cara lain, yang saya lakukan sendiri pertama kali saya melihat hal semacam ini adalah untuk secara ortogonal menyapu ubin terlihat dan tepi ubin dan menghasilkan tepi (dan mungkin sudut iirc) menggambarkan adegan dalam jumlah tepi terendah. Anda kemudian dapat menyisihkan tepi yang tersembunyi dan membentuk fitur bayangan kustom seperti bayangan tersembunyi jika Anda ingin menunjukkan sedikit dinding. Kemudian buat geometri bayangan Anda (pengecoran bayangan proyektif?) Dan render di atasnya.

Tetapi jika saya mencoba untuk mengambil ide itu ke 3d, itu menjadi lebih mudah untuk melakukannya dalam 3d. Sementara metode yang dijelaskan oleh Eric Lippert mungkin bisa dikonversi menjadi 3d. Tapi saya pikir Anda akan menemukan bahwa melakukannya dalam 3d itu mahal. Mungkin lihat juga kode sumber untuk Brogue . Ini mungkin memiliki implementasi yang lebih efisien untuk visibilitas 2d / pengecoran bayangan.

Semoga berhasil.

Gavin Williams
sumber