Bir düşman AI'nın duyabileceği bir ses nasıl eklenir?


10

Verilen:

  • 2D yukarıdan aşağıya oyun
  • Kutucuklar 2B dizide saklanır
  • Her karonun bir özelliği vardır - nemlendirin (tuğlalar -50db olabilir, hava -1 olabilir)

Bundan x1, y1 noktasında bir ses üretilecek ve "dalgalanacaktır" diye eklemek istiyorum. Aşağıdaki görüntü bunu daha iyi özetliyor. Açıkçası nihai hedef, AI düşmanı sesi "duyabilir" - ancak bir duvar onu engelliyorsa, ses o kadar uzağa gitmez.

resim açıklamasını buraya girin

Kırmızı, 50db'lik bir sönümlemeye sahip olan duvardır.

Bence 3. oyun işaretinde matematik kafalarımı karıştırıyorum.

Bunu uygulamanın en iyi yolu ne olabilir?


1
Hiç yansıtan / yankılanan sesi önemsiyor musunuz? Yani, ses geçirmez duvarın bir bölümü doğrudan ses kaynağı ile AI aracısı arasındaysa, ancak duvar serbestçe dolaşılabiliyorsa, AI aracısı sesi hala duymalı mıdır? Yanıt hayırsa, ses başına her hücreyi yalnızca bir kez güncelleyin, böylece sönümleme her ses kaynağına yalnızca bir kez uygulanır. Yalnızca birkaç AI aracınız varsa, bir satırı kaynaktan ajana kadar izleyin.
Sean Middleditch

Amaç, duvarların etrafındaki seslerinizi takip eden pek çok 'aptal' ajana sahip olmaktır.
Chris

Yanıtlar:


7

Bu makul bir fikir gibi görünüyor, unutmayın, bu bir oyun özelliği, oyun için gerekli olandan daha karmaşık hale getirmeyin.

Sesin hemen yayılması için düzeninizi değiştiririm, çünkü bu programlanması daha kolaydır ve gerçek sesin hızlı yayılmasıyla daha tutarlı görünür.

Bu aslında bir yol bulma problemidir ve muhtemelen en iyisi Dijkstra'nın algoritması kullanılarak çözülmüştür. Bu bire çok nokta arama (bir ses kaynağı, birden çok düşman) ve tek noktadan başlayarak verimli bir şekilde çözülebilir.

Kaynaktan bir forma yaparak işe başlarsınız ve henüz işaretlenmemiş ve hesaplanan hacmi 0'ın üzerinde olan tüm komşuları işaretlersiniz, her bir listeye eklediğiniz komşuların her biri. Bu liste hesaplanan hacme göre sıralanmalıdır. Ardından, listedeki en yüksek ses girişi için işlemi tekrarlayın, listeye gerektiği gibi yeni girişler ekleyin ve işlediğiniz girişi kaldırın. Liste boşalana kadar tekrarlayın.

Bu süreçte ne zaman bir düşmanla bir karoya ulaşırsanız, düşmanın hangi hacmi duyduğunu bilirsiniz.


1
Anında sesli seyahat için +1. Bu şeyleri önemseyen bir fizik simülasyonu yapmadığınız sürece KISS.
Hackworth

Hmmm kulağa hoş geliyor. Ayrıca basit tutmak konusunda @Hackworth ile hemfikirim. Anlık ses, anıldığı anda böyle bir 'kuruş düştü' anıydı. Dijkstra'nın algoritması hakkında okumaya başladım, ancak sadece onaylamak için, farklı duvar türlerini ayarlamak için ağırlıklı düğümler içerebilir?
Chris

@Chris Evet, Dijkstra'nın duvarları modellemek için iyi bir yol olan ağırlıklı düğümlerle de çalışması (örn. Ağırlık hacmi azaltacaktır vb.)
bummzack

9

Bir yol bulucunun gerekli olduğunu düşünmüyorum, sadece bölgedeki her AI'ye ışın atmak, eğer bir duvar varsa, duymuyorlar. Bu, en iyi şekilde bir tür sahne grafiği + uzaysal bölümleme ile çalışır


Bu yanıta katılıyorum.
bobobobo

Sesi depolamak için kullanılan veri yapısı da bu şekilde çok daha basit olacaktır.
Chris

Bir ışın atımı fikrini seviyorum, ancak bunun farklı duvar türlerinden geçen sesi açıklayıp açıklamayacağını bilmiyorum. Örneğin, küçük bir ayak basamağı sesi duvardan geçmez, ancak silah ateşleme sesi gelirdi. Ama bu durumda ışın dökümünün bu durumları
Chris

1
Chris, sadece ţeytan fikrini al ve biraz aç. Işın bir nesneyle her kesiştiğinde sesin sesini bir miktar azaltır. Ses düzeyi AI'ya ulaşmadan sıfıra düşürülürse, duyulmaz. AI'ya ulaşırsa, elinde bir "hacim" değerine sahipsiniz. Bu tür bir "ses seviyesini azaltan ışın izini" kullanarak mesafeye ses düşmesi uygulayabilirsiniz.
Tim Holt

Zaman Holt - iyi bir nokta, bu çizgiler boyunca düşünmüyordum
Chris

0

Uygulamanızın bir hücredeki ses seviyesinin kümülatif olduğunu ve genliğin her yöne eşit olarak dışarı doğru hareket ettiğini varsaydığını düşünüyorum. Ses yayılmıyor, kare kare, çalıyor veya çalmıyor ve herhangi bir noktada çalınacak genliği bulmak istiyorsunuz.

Kiremitlerin içinden yayın yapmak, bunu yapmanın bir yoludur (ve muhtemelen en etkili yoludur). Sadece verici ve alıcı arasında bir çizgi çizin ve yol boyunca her bir hücrenin sönümleme değerini çıkarın. Sayı pozitifse sesi çalarsınız.

Dolaylı sesi modellemek istiyorsanız, yol bulmanız gerekecektir. Yayıcıya ağacınızın kökü gibi davranın ve her bitişik hücreyi bağlantılı bir düğüm olarak modelleyin. Her bağlantının, geçerli hacimden çıkarılan bir maliyeti vardır. Alıcıyı bulana veya ses düzeyiniz sıfırın altına düşene kadar grafikte dolaşmaya devam edin (eğer öyleyse, geriye doğru izleyin ve başka bir yol deneyin). Alıcıya pozitif ses seviyesinde yol yoksa, vericiniz duyulamaz. Not: alıcıyı bulduğunuzda sadece traversten vazgeçemezsiniz, çünkü vericiden alıcıya birden fazla yol olabilir ve en yüksek hacme sahip olana ihtiyacınız vardır.

Sesin nereden geldiğini önemseyen AI'yı modelliyorsanız, ikinci yaklaşım yardımcı olacaktır - AI, sesi yoldaki son segmentin yönünden 'duymak' olacaktır. Güzel, alıcıya iki sesli yol varsa, AI çoklu sesler ve hangi yöne gidecekleri konusunda karıştırılabilir.


1
Ses olan sıvı ile iletilen bir dalga. Bir oyunda bu şekilde simüle etmek uygun olmayabilir, ama bu kesinlikle “sesin işleyişi değil”.
Kevin Reid

Adil nokta, düzenlendi
MrCranky
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.