鉴于:
- 2D自上而下的游戏
- 切片仅存储在2D阵列中
- 每个瓷砖都有一个属性-阻尼(所以砖可能是-50db,空气可能是-1)
我想从中添加它,以便在点x1,y1处产生声音,并“涟漪”出来。下图显示了更好的轮廓。显然,最终目标是AI敌人可以“听到”声音-但是如果墙壁挡住了声音,声音就不会传播到最远。
红色是墙,阻尼值为50db。
我认为在第三局打勾中我的数学困惑。
实施此方法的最佳方法是什么?
鉴于:
我想从中添加它,以便在点x1,y1处产生声音,并“涟漪”出来。下图显示了更好的轮廓。显然,最终目标是AI敌人可以“听到”声音-但是如果墙壁挡住了声音,声音就不会传播到最远。
红色是墙,阻尼值为50db。
我认为在第三局打勾中我的数学困惑。
实施此方法的最佳方法是什么?
Answers:
记住,这似乎是个合理的主意,但这是一个游戏功能,不要使其比游戏所需的功能更复杂。
我会更改您的方案以立即传播声音,因为这可能更容易编程,并且看起来与真实声音的快速传播更加一致。
这本质上是一个寻路问题,可能最好使用Dijkstra的算法解决。这是一个一对多的点搜索(一个声源,多个敌人),因此可以通过从单个点开始有效地解决。
您首先从源进行扩展,然后标记所有尚未标记且计算量大于0的邻居,将每个邻居添加到列表中。该列表必须按计算出的数量排序。然后,对列表上最大数量的条目重复此过程,根据需要向列表中添加新条目,并删除已处理的条目。重复直到列表为空。
每当您在此过程中与敌人接触时,您就会知道敌人听到的声音量。
我认为不需要路径查找器,只需将射线投射到该区域中的每个AI,如果有障碍墙,他们就不会听到。这对某种场景图+空间分区最有效
我认为您的实现假设单元中的声音水平是累积的,并且振幅只是在各个方向均匀向外移动。声音不会逐帧散布,它正在播放或没有播放,并且您想找出在任何给定点播放的振幅。
通过磁贴进行光线投射是一种方法(可能是最有效的方法)。只需在发射器和接收器之间画一条线,然后减去每个单元的衰减值。如果数字为正,则播放声音。
如果要对间接声音建模,则必须寻找路径。将发射器视为树的根,并将每个相邻单元建模为链接节点。从当前数量中减去每个链接的成本。继续遍历图形,直到找到接收器或音量降到零以下(如果是,则回溯并尝试其他路径)。如果没有通往正音量的接收器的路径,则不会听到您的发射器的声音。注意:找到接收器时,您不能只是放弃遍历,因为从发射器到接收器可能有多条路径,并且您需要一条具有最大音量的路径。
如果您正在建模的AI关心声音的来源,则后一种方法会有所帮助-AI将“听到”声音来自路径上最后一段的方向。很好,如果有两条通向接收器的声音路径,它们的AI可能会因多种声音和所采取的方向而感到困惑。