2010-11-04 53 views
5

我正在开发一款游戏。 如何基于当前渲染场景中的精灵“距离”来“淡入”声音的音量? 想我再也世界:基于距离(x,y)设置适当的“音频”音量的算法

WIDTH_WORLD = 10000 
HEIGHT_WORLD = 10000 

Current Scene 
xCurrent = 800 (+ Width Res. = 800 + 1024 = 1824) 
yCurrent = 400 (+ Height Res. = 400 + 768 =...) 

Far Sprite 
xSprite = 7000 
ySprite = 3000 

什么是好的算法来“计算”音量(也许是左/右平移通道的比例)? 在此先感谢!

+0

库我是什么使用的是SDL.NET(基于SDL的obv) – stighy 2010-11-04 17:35:19

+0

不要忘记多普勒效应! – 2010-11-04 17:55:58

回答

2

总Volumn

  • 有该卷的衰减的几种方法。例如。您可以使用线性减震功能,如volume = max(0, max_volume - max_volume/max_distance * distance),或者使用反转距离减少的功能,如volume = min(max_volume, max_volume/distance)

余额比例

  • 同样,也有以实现足够的功能的几种方法。在你的情况下,你可以说,如果对象处于或超出屏幕左边界,则向左平移,如果对象处于或超出屏幕右边界,向右平移,否则使用插值函数,例如。 balance = (object_x-camera_x)/screen_half_width,值在-1:left,+1:right和0:center之间。

当结合这些方法,你必须考虑什么是适合你的情况:例如只有潮湿卷如果对象超出屏幕范围的,永远......

+0

谢谢你,它就像一个魅力! ;) – stighy 2010-11-04 22:01:39

0

嗯,声音的音量会降低到与声源距离的平方,所以这会给你一个开始的好地方。

知道你使用的游戏库会有所帮助,但许多游戏库已经具有这种功能。

+0

正方形?我猜想立方体,因为它是三维空间。很大程度上取决于'volume'是如何被定义的...... – Wrikken 2010-11-04 17:34:25

+2

嗯,的确如此。声音不会“填充”音量,也不会按立方体传播。它会通过一个球体旅行(前述的技术性问题,如站在地面上/固体物体的弹跳),并且生活在地表上('4 PI r^2')。我的第一本能是完全错误的,我纠正了。 – Wrikken 2010-11-04 18:03:57

2

使用距离(Dsquared = xdist^2 + ydist^2)作为比例因子来缩小音量。反转此距离平方值以直接应用于您的音量(音量以距离的平方值下降,无论如何距离很容易计算为平方值)。

左/右声道比例只需通过为左右声道(分别为渲染位置的左侧和右侧)定义两个不同的点来完成,然后执行上述计算,并查找您的声道比率那样。因为上面的计算只是两个平方的总和,所以它在计算上非常简单。