如何添加敌方AI可以听到的声音?


10

鉴于:

  • 2D自上而下的游戏
  • 切片仅存储在2D阵列中
  • 每个瓷砖都有一个属性-阻尼(所以砖可能是-50db,空气可能是-1)

我想从中添加它,以便在点x1,y1处产生声音,并“涟漪”出来。下图显示了更好的轮廓。显然,最终目标是AI敌人可以“听到”声音-但是如果墙壁挡住了声音,声音就不会传播到最远。

在此处输入图片说明

红色是墙,阻尼值为50db。

我认为在第三局打勾中我的数学困惑。

实施此方法的最佳方法是什么?


1
您是否完全关心反射/回响的声音?也就是说,如果一段隔音墙直接位于声源和AI代理之间,但是可以自由走动,则AI代理是否仍可以听到声音?如果答案是否定的,则每个声音仅更新每个单元一次,因此对每个声音源仅进行一次衰减。如果您只有几个AI代理,则只需在源到代理之间跟踪一条线即可。
肖恩·米德迪奇

我们的目标是让许多“愚蠢”的经纪人跟随您在墙壁周围的声音,而不会出现。
克里斯(Chris)

Answers:


7

记住,这似乎是个合理的主意,但这是一个游戏功能,不要使其比游戏所需的功能更复杂。

我会更改您的方案以立即传播声音,因为这可能更容易编程,并且看起来与真实声音的快速传播更加一致。

这本质上是一个寻路问题,可能最好使用Dijkstra的算法解决。这是一个一对多的点搜索(一个声源,多个敌人),因此可以通过从单个点开始有效地解决。

您首先从源进行扩展,然后标记所有尚未标记且计算量大于0的邻居,将每个邻居添加到列表中。该列表必须按计算出的数量排序。然后,对列表上最大数量的条目重复此过程,根据需要向列表中添加新条目,并删除已处理的条目。重复直到列表为空。

每当您在此过程中与敌人接触时,您就会知道敌人听到的声音量。


1
+1可立即传播声音。除非您要进行一个物理仿真,否则KISS。
Hackworth

嗯听起来真的很好。我也同意@Hackworth保持简单。即时的声音在被提及的那一刻就如此“一分钱掉了”。我已经开始阅读有关Dijkstra算法的信息,但是为了确认这一点,它可以包含加权节点以针对不同类型的墙进行调整吗?
克里斯(Chris)

@Chris是的,Dijkstra还可以处理加权节点,这将是对墙进行建模的好方法(例如,重量会减少体积等)
bummzack 2012年

9

我认为不需要路径查找器,只需将射线投射到该区域中的每个AI,如果有障碍墙,他们就不会听到。这对某种场景图+空间分区最有效


我同意这个答案。
bobobobo 2012年

这种存储声音的数据结构也将以这种方式更加简单。
克里斯(Chris)

我喜欢射线投射的想法,但是我不知道这是否可以解释声音通过不同类型的墙壁的情况。例如,很小的脚步声不会穿过墙壁,但是枪声会响。但是在这种情况下,我不知道射线投射是否可以解决这些情况
克里斯(Chris)

1
克里斯,只是接受光线投射的想法,然后再扩大一点。射线每次与物体相交时,都会使声音的音量降低一定程度。如果在到达AI之前将音量减小到零,则不会听到。如果确实达到了AI,那么您手中就有一个“成交量”值。您还可以使用这种“体积减小的光线轨迹”在远处应用声音衰减。
蒂姆·霍尔特

@蒂姆·霍尔特(Tim Holt)-好点,我不是在考虑这些问题
克里斯(Chris)

0

我认为您的实现假设单元中的声音水平是累积的,并且振幅只是在各个方向均匀向外移动。声音不会逐帧散布,它正在播放或没有播放,并且您想找出在任何给定点播放的振幅。

通过磁贴进行光线投射是一种方法(可能是最有效的方法)。只需在发射器和接收器之间画一条线,然后减去每个单元的衰减值。如果数字为正,则播放声音。

如果要对间接声音建模,则必须寻找路径。将发射器视为树的根,并将每个相邻单元建模为链接节点。从当前数量中减去每个链接的成本。继续遍历图形,直到找到接收器或音量降到零以下(如果是,则回溯并尝试其他路径)。如果没有通往正音量的接收器的路径,则不会听到您的发射器的声音。注意:找到接收器时,您不能只是放弃遍历,因为从发射器到接收器可能有多条路径,并且您需要一条具有最大音量的路径。

如果您正在建模的AI关心声音的来源,则后一种方法会有所帮助-AI将“听到”声音来自路径上最后一段的方向。很好,如果有两条通向接收器的声音路径,它们的AI可能会因多种声音和所采取的方向而感到困惑。


1
声音通过流体传播的波。在游戏中以这种方式模拟它可能不合适,但是那肯定不是“不是声音的工作方式”。
凯文·里德

公平点,经编辑
MrCranky
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.