Pertimbangkan kotak ubin 2d, dan bidang koordinat yang diperkirakan - berpusat pada pemain - yang mewakili garis pandang. Tujuannya adalah untuk memblokir garis pandang melampaui rintangan (yaitu dinding).
Ini relatif sederhana untuk menentukan apakah sel individu di bidang penglihatan terlihat: melemparkan sinar dari pemain ke sel target, menggunakan sel Bresenham - jika salah satu sel yang tumpang tindih antara pemain dan target adalah hambatan, sel target tidak terlihat.
Sekarang, pikiran pertama saya adalah beralih melalui semua sel-sel kotak di garis pandang - tetapi ini tampaknya tidak efisien bagi saya. Misalnya, jika pemain berdiri di sebelah dinding, dan Anda menentukan bahwa sel di luar dinding tidak terlihat, Anda dapat menentukan semua sel pada ray setelah itu tidak akan terlihat.
Juga dianggap melemparkan sinar ke setiap sel sepanjang garis pandang, dan mengulangi setiap sel di sepanjang setiap sinar - tapi kemudian saya akan memproses beberapa sel lebih dari satu kali.
Apakah ada cara yang lebih efisien untuk melakukan ini?
Sementara iterasi ~ 50 sel per giliran adalah perhitungan yang relatif ringan, saya akan mempercepat - tujuannya adalah untuk dapat memutar beberapa putaran per detik pada putar otomatis. Jadi, semakin efisien saya bisa membuat ini, semakin baik.
sumber
Jawaban:
Anda bisa mencoba melempar "bayangan busur" untuk menutupi area yang lebih besar sekaligus. Sementara detail sebenarnya sedikit terlibat, Eric Lippert memiliki penjelasan yang sangat mendalam (dengan demo Silverlight langsung) di http://blogs.msdn.com/b/ericlippert/archive/2011/12/12/shadowcasting-in -c-part-one.aspx .
sumber
Saya telah mengimplementasikan algoritma yang disarankan oleh Jimmy.
Video kode tersebut sedang beraksi di sini: https://youtu.be/lIlPfwlcbHo
sumber