Diberikan:
- permainan top-down 2D
- Ubin disimpan hanya dalam array 2D
- Setiap ubin memiliki properti - basahi (jadi batu bata mungkin -50db, udara mungkin -1)
Dari sini saya ingin menambahkannya sehingga suara dihasilkan pada titik x1, y1 dan "riak keluar". Gambar di bawah ini menguraikannya dengan lebih baik. Jelas tujuan akhirnya adalah bahwa musuh AI dapat "mendengar" suara - tetapi jika dinding menghalangi itu, suara tidak berjalan sejauh itu.
Merah adalah dinding, yang memiliki kelembaban 50db.
Saya pikir dalam centang game ke-3 saya membingungkan matematika saya.
Apa cara terbaik untuk mengimplementasikan ini?
Jawaban:
Sepertinya ide yang masuk akal, ingat juga, ini adalah fitur gameplay, jangan membuatnya lebih rumit dari apa yang diperlukan untuk gameplay.
Saya akan mengubah skema Anda agar penyebaran suara segera, karena itu mungkin lebih mudah diprogram dan tampaknya lebih konsisten dengan penyebaran suara nyata yang cepat.
Ini pada dasarnya adalah masalah merintis jalan, dan mungkin lebih baik diselesaikan dengan menggunakan algoritma Dijkstra. Ini pencarian satu ke banyak titik (satu sumber suara, banyak musuh), dan dapat diselesaikan secara efisien dengan mulai dari satu titik.
Anda mulai dengan melakukan penyebaran dari sumber, dan tandai semua tetangga yang belum ditandai dan memiliki volume yang dihitung di atas 0, masing-masing tetangga yang Anda tambahkan ke daftar. Daftar itu harus disortir berdasarkan volume yang dihitung. Kemudian Anda mengulangi proses untuk entri volume tertinggi pada daftar, menambahkan entri baru ke daftar yang diperlukan, dan menghapus yang sudah Anda tangani. Ulangi sampai daftar kosong.
Setiap kali Anda selama proses ini mencapai ubin dengan musuh Anda tahu volume apa yang didengar musuh.
sumber
Saya tidak berpikir seorang pencari jalan diperlukan, cukup ray cast ke setiap AI di daerah tersebut, jika ada dinding di jalan, mereka tidak mendengarnya. Ini akan bekerja paling baik dengan semacam grafik adegan + partisi spasial
sumber
Saya pikir implementasi Anda mengasumsikan tingkat suara dalam sel bersifat kumulatif, dan amplitudo hanya bergerak ke luar secara merata di semua arah. Suara tidak menyebar, bingkai demi bingkai, entah diputar atau tidak, dan Anda ingin mengetahui amplitudo untuk diputar pada titik mana pun.
Raycasting melalui ubin adalah salah satu cara (dan mungkin cara paling efektif) untuk melakukannya. Cukup tarik garis antara emitor dan penerima, dan kurangi nilai peredam dari setiap sel di sepanjang jalan. Jika angkanya positif, Anda memutar suaranya.
Jika Anda ingin memodelkan suara tidak langsung, maka Anda harus mencari jalur. Perlakukan emitor sebagai akar dari pohon Anda, dan modelkan setiap sel yang berdekatan sebagai simpul yang terhubung. Setiap tautan memiliki biaya, dikurangi dari volume saat ini. Teruslah menelusuri grafik sampai Anda menemukan penerima atau volume Anda turun di bawah nol (jika ya, mundur dan coba jalur lain). Jika tidak ada jalur ke penerima dengan volume positif, emitor Anda tidak dapat didengar. NB: Anda tidak bisa menyerah begitu saja ketika menemukan receiver, karena mungkin ada banyak jalur dari emitor ke penerima, dan Anda membutuhkan jalur dengan volume tertinggi.
Jika Anda memodelkan AI yang peduli dari mana suara itu berasal, pendekatan terakhir akan membantu - AI akan 'mendengar' suara datang dari arah segmen terakhir di jalan. Baik, jika ada dua jalur yang dapat didengar untuk penerima, mereka AI bisa bingung tentang beberapa suara dan arah mana yang harus diambil.
sumber