Bagaimana Anda bisa memodelkan “jejak aroma” dalam sebuah game?

11

Katakanlah Anda ingin membuat game 3D, dan memiliki pemain, atau ponsel, dapat melacak entitas lain dengan mengikuti jejak aroma mereka. Apakah ada struktur data yang diketahui yang cocok dengan use case ini?

Jika Anda hanya memiliki sedikit individu, Anda mungkin dapat melakukan sesuatu seperti peta 3D coord ke entitas ID, tetapi aroma nyata bekerja secara berbeda, karena memudar seiring waktu, tetapi perlahan. Dan sebagian besar waktu, Anda hanya bisa tahu kira-kira apa yang pergi ke sana, dan kira-kira berapa banyak hal dari jenis itu pergi ke sana. Dan perkiraannya menjadi semakin buruk seiring waktu, sampai hilang.

Saya membayangkan itu seperti memulai dengan angka yang tepat, dan perlahan-lahan kehilangan digit paling signifikan, sampai Anda kehilangan digit paling signifikan juga. Tapi itu tidak benar-benar membantu saya, karena ID entitas biasanya tidak dikodekan untuk mengandung tipe entitas, selain ID individu itu.

Sebastien Diot
sumber
Dwarf Fortress melakukan hal seperti itu di rilis berikutnya.
Russell

Jawaban:

10

Ada banyak variasi dalam bagaimana Anda bisa melakukan ini; Saya akan menyarankan pilihan "jelas bagi saya", tetapi ada banyak variasi yang dapat dirancang. Penafian: Saya belum benar-benar menerapkan hal seperti ini.

Pertama, Anda membutuhkan struktur data yang mencakup dunia Anda. Jika Anda melakukan gerakan NPC dalam ruang 3D, maka Anda mungkin memiliki, atau pada akhirnya akan membutuhkan, struktur seperti itu untuk tujuan merintis jalan - katakanlah, jala navigasi. Jadi, mari kita asumsikan kita dapat menambahkan bidang untuk aroma itu.

Jadi, apa yang kita masukkan di bidang itu? Saya mengusulkan daftar catatan ( aroma , kekuatan , waktu ). Daftar ini disimpan pada atau di bawah panjang maksimum, dan diurutkan berdasarkan kekuatan - sehingga aroma yang lemah akan dibuang. The aroma bisa berupa sesuatu yang eksplisit didefinisikan untuk setiap entitas atau entitas jenis, atau itu hanya bisa menjadi tipe entitas - tergantung pada apa yang Anda ingin dapat melacak jelas. The Waktu adalah timestamp ketika rekaman aroma ini terakhir diperbarui.

Ketika suatu entitas melewati suatu area (misalnya segitiga tertentu dari jala navigasi), sekarang saatnya untuk memperbarui daftar aroma. Pertama, kurangi semua kekuatan sesuai dengan jumlah waktu yang berlalu sesuai dengan nilai waktu vs waktu saat ini - peluruhan eksponensial mungkin merupakan pilihan yang masuk akal di sini. Kemudian tambahkan aroma entitas saat ini ke daftar, mungkin dengan kekuatan yang bergantung pada jenis entitas. Kemudian jika daftar terlalu panjang, buang kekuatan terendah.

Untuk mendapatkan hasil pelacakan, temukan aroma dalam daftar untuk lokasi saat ini, kemudian lakukan hal yang sama untuk semua tetangganya, dan pergi ke arah aroma terkuat (itu bukan arah yang baru saja berasal dari pelacak).

Untuk realisme ekstra:

  • Difusi: secara berkala mentransfer sebagian aroma di setiap lokasi ke tetangganya. Ini membingungkan jalan, tetapi juga berarti bahwa benda-benda diam dapat diendus (mencari makanan, mayat, dll). (Itu bahkan semacam AI yang diakui untuk mendasarkan tindakan sepenuhnya pada jenis informasi ini - lanskap memberikan informasi tentang cara yang harus ditempuh untuk mendapatkan sumber daya tertentu, dll. Saya lupa namanya.) Kerugian utama adalah waktu yang dihabiskan menghitung difusi di mana-mana.

  • Aroma yang kuat harus mencegah deteksi aroma yang lemah; Bagi kekuatan aroma yang dicari dengan kekuatan aroma yang terkuat, dan gagal jika terlalu kecil. Ini bisa membuat jejak aroma seseorang dengan sengaja membingungkan.

Kevin Reid
sumber
9

Saya akan memodifikasi teknik yang disebut pemetaan pengaruh untuk membuat peta untuk aroma. Ini akan menghilang dan memudar secara alami, menyatu dan bersaing dengan aroma lain, dan mungkin lebih. Ini terdengar seperti itu akan melakukan apa yang Anda inginkan, tetapi mungkin lebih rumit daripada apa yang Anda ingin implementasikan. Paling tidak itu harus memberi Anda beberapa ide bagus, dan itu cukup sederhana untuk diterapkan di atas struktur apa pun yang Anda gunakan saat ini.

Tutorial / penjelasan yang saya temukan bermanfaat.

jsonnull
sumber