用ogre做图像引擎,用MITA做音频引擎做游戏的源代码1(附完整工程代码资源下载地址)

简要说明:

在这个项目中我添加了4个不用的物体和它们各自的声音.分别实现了四种不同的声音效果:在地面静止的音源(音响),在高空中静止的音源(直升飞机),在地面运动的音源(汽车),在空中做抛物线运动的音源(战斗机).通过移动角色,可以感受到3D声音的变化.
我使用了MITA作为音频引擎.MITA使用起来非常简单与灵活,甚至比fmod更加简单,性价比更高.在无损音质的同时它也非常高效.

如何一步一步实现同样的工程项目:
0.下载一个OgreSDK和MITA的sdk开发包.安装好OgreSDK.
1.将SDK包中include下mita.h拷贝到工作目录.比如:[项目]\include.
2.将SDK包中library\VC下的mita.lib和mitaD.lib分别拷贝到工作目录下的lib相关目录下.比如用ogre做游戏,可以将它们拷贝到OgreSDK_vc9_v1-7-2\lib下分别放到release和debug两个文件夹中.然后在vs的工程项目属性的配置属性下的链接器下的输入下附加依赖项里面分别添加mita.lib和mitaD.lib.
3.将SDK包中mita.dll和mitaD.dll分别拷贝到工程输出目录下,比如:OgreSDK_vc9_v1-7-2\bin.
4.将SDK包中的plugins下需要用到的插件拷贝到工程插件目录下,比如:OgreSDK_vc9_v1-7-2\plugins.插件的类型看前缀:cdc_mapl.dll用来实现自定义播放列表,dec_开头是解码插件,dev_是播放设备插件,dsp_是音效插件.比如:我选择的插件有: dec_ogg.dll(用来播放ogg格式音乐) dev_mme.dll(使用mme设备驱动).
5.还需要注意的是将音乐文件也放置到正确的目录下,音乐文件的格式应该是加载的解码插件中的一种.比如我将音乐文件放在了OgreSDK_vc9_v1-7-2\media下,然后在代码用Param.lpPath = (MITA_LPCWSTR)L"../../media/123.ogg";来调用播放.

声音的主要处理过程(以ogre作为游戏引擎说明):
1.初始化音频设备,参考initMitaDevice().
2.对于3D游戏,声音具有距离和方向,听者Listener需要与角色的位置绑定.通过frameRenderingQueued()里面的监听即可实现.得到了evt.timeSinceLastFrame后,角色的位置等就会更新,这时候插入MITA_Input_Move3D()和MITA_Listener_SetDirection(),将角色的位置和方向同步即可.具体参加updateBody(Real deltaTime).
3.播放音乐.实现一个静止的声音播放很简单,参考playSpMusic()的实现.对于一个运动的声音,同样是在frameRenderingQueued()中插入声音运动的代码,MITA_Input_Move3D()将声音的位置与运动的物体的位置同步,具体参见f18addTime()和caraddTime().

注意:
1.我有5.1个音响,所以设置了MITA_GuessChannelMode(6,&ChannelMask),如果您仅仅是用耳麦来运行的话请改成MITA_GuessChannelMode(2, &ChannelMask).
2.MITA_Listener_SetPosition()(设置听者位置)一般与MITA_Listener_SetVelocity()(如果听者在移动的话设置听者的速率)联合使用,所以一般情况下如果不是特别要设置速率的话,使用MITA_Input_Move3D()就可以了,系统会自动为您计算好所有的情况.
3.MITA_Input_SetDistance3D()中设置最短距离和最长距离并不是说声音的传播范围,而是说声音的衰减变化范围,声音在小于最短距离的时候,声音就不再变化,始终是最强音量,而在大于最长距离的时候,声音就不再衰减,始终保持与最长距离一样的音量,所以当音源的音量非常大,它会传播1000个单位的距离,而设置了最长距离是500,那么在1001个单位的距离也能够听到声音,而且声音的音量与距离500单位远的音量相同.最长距离设定不应该小于100,但是最好是可以设置尽可能比实际音效距离远一点,这样的效果更真实.如果想要控制声音的传播距离,那么可以设置声音的音量MITA_Input_SetVolume(),传播的衰减系数MITA_Input_SetRollOff3D()与音源强度MITA_Input_SetStrength3D()来达到控制声音传播范围的效果.当然也可以检测听者的位置,通过判断听者的位置来播放或停止播放输入的音源,也可以达到效果(通常可以实现一堵隔音墙的效果).
4.MITA_Input_SetDirection3D(),向前向量必须是单位向量而且是与向上向量垂直,向上向量必须是单位向量而且是与向前向量垂直.一般来说,如果知道了角色转身转到的角度,就很容易可以得到这些向量了.首先,对于向上的向量,如果是一般的游戏,角色永远都是站立着的,那么角色向上的方向就是从脚底指向头部的方向,即一直保持(0,1,0)不变即可(注意在ogre中y轴的方向是向上的方向).而角色面部朝向的方向是向前的方向,于是计算sin(角度)和cos(角度)即可得到对应的向前向量的x和z的值(注意sin和cos里面角度是弧度制而不是360度的角度制).当然在这里我使用了一个更简单的函数MITA_Listener_SetDirectionAngle

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值