Bagaimana cara menambahkan suara yang dapat didengar musuh AI?

10

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.

masukkan deskripsi gambar di sini

Merah adalah dinding, yang memiliki kelembaban 50db.

Saya pikir dalam centang game ke-3 saya membingungkan matematika saya.

Apa cara terbaik untuk mengimplementasikan ini?

Chris
sumber
1
Apakah Anda peduli dengan suara yang mencerminkan / bergaung sama sekali? Yaitu, jika bagian dinding kedap suara berada langsung antara sumber suara dan agen AI, tetapi dinding dapat berjalan bebas, haruskah agen AI masih mendengar suara? Jika jawabannya tidak, maka perbarui setiap sel sekali saja per suara, jadi peredam hanya diterapkan satu kali untuk setiap sumber suara. Jika Anda hanya memiliki beberapa agen AI, cukup lacak garis dari sumber ke agen.
Sean Middleditch
Tujuannya adalah memiliki banyak agen 'bodoh' mengikuti suara Anda di sekitar dinding dan apa yang tidak.
Chris

Jawaban:

7

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.

aaaaaaaaaaaa
sumber
1
+1 untuk perjalanan suara langsung. Kecuali Anda membuat simulasi fisika yang peduli tentang hal itu, KISS.
Hackworth
Hmmm terdengar sangat bagus. Saya juga setuju dengan @Hackworth tentang menjaganya tetap sederhana. Suara langsung seperti 'sen telah turun' saat saat itu disebutkan. Saya sudah mulai membaca tentang algoritma Dijkstra, tetapi hanya untuk mengonfirmasi, itu dapat mencakup node tertimbang untuk menyesuaikan berbagai jenis dinding?
Chris
@ Chris Ya, Dijkstra's juga bekerja dengan node berbobot yang akan menjadi cara yang baik untuk memodelkan dinding (mis. Berat akan mengurangi volume, dll.)
bummzack
9

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

CobaltHex
sumber
Saya setuju dengan jawaban ini.
bobobobo
Struktur data untuk menyimpan suara akan jauh lebih sederhana dengan cara ini juga.
Chris
Saya suka ide pemain sinar, tapi saya tidak tahu apakah itu akan menjelaskan suara yang melewati berbagai jenis dinding. Misalnya, suara langkah kaki kecil tidak akan melewati dinding, tetapi suara tembakan senjata akan. Tetapi dalam kasus ini saya tidak tahu apakah ray casting akan menyelesaikan situasi tersebut
Chris
1
Chris, ambil saja ide raycast dan kembangkan sedikit. Setiap kali sinar memotong suatu objek, ia mengurangi volume suara dengan jumlah tertentu. Jika volume dikurangi menjadi nol sebelum mencapai AI, itu tidak terdengar. Jika itu mencapai AI, maka Anda memiliki nilai "volume" di tangan. Anda juga dapat menggunakan "jejak sinar" dengan pengurangan volume ini untuk menerapkan penurunan kualitas suara dari jarak jauh.
Tim Holt
@ Tim Holt - poin bagus, saya tidak berpikir seperti itu
Chris
0

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.

MrCranky
sumber
1
Suara adalah gelombang yang ditransmisikan melalui fluida. Mungkin tidak tepat untuk mensimulasikannya seperti itu dalam sebuah game, tapi itu tentu saja bukan "bukan cara suara bekerja".
Kevin Reid
Fair point, diedit
MrCranky