Terjadi masalah yang menarik. Saya perlu mencari cara untuk mensimulasikan garis pandang - cukup sederhana, hanya pada grid 2d dengan hambatan. Entah sel kisi terlihat, atau tidak.
Saya bisa mendapatkan sesuatu yang benar-benar belum sempurna - seperti menyebarkan n spasi dari pemain, atau memblokir perambatan horizontal ketika ada kendala yang berdekatan terdeteksi, tetapi saya tidak bisa membiarkan diri saya hidup dengannya. Banyak aplikasi lain menggunakan metode yang lebih canggih yang memiringkan garis pandang di sudut-sudut dll, dan saya ingin secara normal.
Sejauh ini DCSS telah menjadi sumber inspirasi saya ketika saya bingung, saya berharap untuk mendapatkan sesuatu yang dekat dengan apa yang mereka miliki: http://crawl.sz.org/ .
Wawasan apa pun akan dihargai - terima kasih atas bantuannya!
(Maafkan jika ini memalukan - hanya memulai permainan dev beberapa minggu lalu, berusaha keras untuk mengejar ketinggalan.)
sumber
Jawaban:
Pengecoran sinar adalah cara yang sangat cepat dan efisien untuk menentukan garis pandang. Ini pada dasarnya melibatkan pengiriman sinar (anggap saja seperti laser tak terbatas yang tidak dapat diarahkan) dari posisi tertentu ke arah tertentu. Dengan menggunakan sinar ini, Anda dapat menentukan hal-hal seperti titik mana yang bersilangan dan seberapa jauh dari titik asal ketika melintasi titik tertentu.
Jadi misalnya, dalam skenario pemain / musuh, sinar bisa berasal dari musuh dengan arah menjadi lokasi pemain. Jika sinar bertabrakan dengan ubin padat, musuh tidak dapat melihat pemain. Jika tidak, musuh dapat melihat pemain.
Berikut ini adalah tutorial yang luar biasa yang akan membantu.
Anda juga dapat mempertimbangkan algoritma garis Bresenham (disimpulkan, itu menciptakan garis) untuk sesuatu yang mungkin lebih mudah diskalakan ke ubin.
sumber
Saya memiliki kode blog untuk menghitung garis pandang dari peta ketinggian. Sebuah peta datar sederhana dengan rintangan hanyalah peta ketinggian yang sangat datar, dan implementasi ini masih sepenuhnya dapat diterapkan.
Ini dia dalam C ++ dan itu
O(n)
; jika Anda tahu ketinggian maksimum di peta, Anda dapat melacak garis pindaian yang tidak memiliki sinar tersisa di bawah ketinggian itu, dan lebih awal:sumber