Menemukan ubin yang tidak tertutup dalam game berbasis ubin

9

Saya sedang mengerjakan game berbasis ubin 2D, dan saat ini saya sedang mencoba untuk mendapatkan 2d setara dengan volume bayangan untuk bekerja. Saya mengalami kesulitan menemukan permukaan yang seharusnya membentuk bayangan. Dari titik mana pun dalam game, saya perlu menemukan wajah yang tidak tertutup, atau seluruh ubin.

Pertanyaan saya adalah, bagaimana saya bisa menemukan ubin / tepian ini secepat mungkin diberikan suatu poin?

Gambar yang menunjukkan garis pandang umum dan ubin yang terpengaruh

Ryan S
sumber

Jawaban:

2

Ini bukan jawaban yang lengkap, tapi semoga akan membantu.

Apakah peta / ubin Anda statis atau dinamis? Jika statis, saya akan sangat menyarankan Anda untuk melakukan pemrosesan offline dan melakukan prakiraan sebanyak yang Anda bisa dengan cara itu. Anda dapat melakukannya dengan cara apa pun yang Anda inginkan (raycasting atau sesuatu yang lebih pintar), tetapi Anda tidak terlalu peduli untuk membuatnya dengan sangat cepat karena semuanya akan terjadi secara offline saat Anda "memanggang" level Anda. Anda dapat melakukan precompute dengan tepat ubin mana yang terlihat dari setiap tempat, atau membuat semacam daerah yang lebih besar dan semua ubin yang berpotensi terlihat dari masing-masing daerah.

Kemudian, saat runtime, permintaan untuk ubin yang terlihat harus sangat mudah dan sangat cepat.

Tentu saja, jika Anda memiliki level yang dibuat secara dinamis, maka ini tidak berlaku sama sekali :-)

Noel Llopis
sumber
1

Anda dapat melihat bagaimana saya menerapkan ini untuk C # roguelike di sini . Kode ini tidak terlalu dioptimalkan, tetapi tampaknya cukup cepat untuk saya dan (lebih penting) harus cukup mudah dibaca. Ini pada dasarnya melakukan algoritma pengecoran bayangan sederhana yang bekerja satu oktan pada suatu waktu.

banyak sekali
sumber
0

Saya tidak yakin platform apa yang Anda gunakan, tetapi saya tidak dapat benar-benar memikirkan platform apa pun yang tidak akan cukup cepat untuk hanya menumbuhkan lingkaran di sekitar entitas penyiaran Anda (kecuali ada banyak em) dan mendeteksi apakah petak yang akan 'diplot' dalam algoritme lingkaran Anda adalah petak yang kokoh dan karenanya lightblocking. Dari sana akan sedikit lebih sulit karena Anda harus melacak segmen lingkaran yang tersumbat atau tidak, tetapi itulah yang akan saya lakukan. Pilihan lain adalah melemparkan sinar dalam lingkaran (sekali lagi cukup cepat) di ruang resolusi ubin dan menghentikan setiap sinar saat menyentuh ubin yang solid.

Kaj
sumber
Yah, saya kebanyakan melakukan permainan Flash dan Javascript, tetapi saat ini, saya melakukan semacam metode brute force yang mulai macet setelah sedikit. Saya pikir jika saya tahu cara mengoptimalkannya, saya bisa menjalankan game ini dengan cukup lancar.
Ryan S
Seharusnya mudah dilakukan dalam flash, mungkin kekuatan kasar Anda bisa dioptimalkan. Selain itu, secara umum, Anda tidak perlu memperbarui setiap frame, sehingga Anda dapat menghitung ulang situasi selanjutnya melalui beberapa frame
Kaj