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

本文档详细介绍了如何利用Ogre3D图形引擎和MITA音频引擎创建一个包含多种声音效果的游戏项目。作者通过四个不同类型的音源展示了3D声音的实现,并提供了详细的步骤来配置OgreSDK和MITA SDK,包括库的拷贝、链接器设置、插件的选择以及音乐文件的放置。此外,还讨论了声音处理的关键步骤,如初始化音频设备、绑定听者位置、播放音乐和控制声音效果。文章最后给出了源代码下载链接。
摘要由CSDN通过智能技术生成

简要说明:

在这个项目中我添加了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().只要知道了转身的角度即可.参考updateBody(Real deltaTime).
5.最后不要忘了CloseHandle和RemoveSource.参考mitademo::~mitademo(void).
6.dec_base.dll支持wma,tta等格式音乐.

BaseApplication.h和mitademo.h两个头文件的源代码,里面有注释,有什么问题给我留言。

下载地址:http://download.csdn.net/source/3444236

/*
-----------------------------------------------------------------------------
Filename: BaseApplication.h
-----------------------------------------------------------------------------
*/
#ifndef __BaseApplication_h_
#define __BaseApplication_h_

#include <OgreCamera.h>
#include <OgreEntity.h>
#include <OgreLogManager.h>
#include <OgreRoot.h>
#include <OgreViewport.h>
#include <OgreSceneManager.h>
#include <OgreRenderWindow.h>
#include <OgreConfigFile.h>

#include <OISEvents.h>
#include <OISInputManager.h>
#include <OISKeyboard.h>
#include <OISMouse.h>

#include <SdkTrays.h>
#include <SdkCameraMan.h>

class BaseApplication : public Ogre::FrameListener, public Ogre::WindowEventListener, public OIS::KeyListener, public OIS::MouseListener, OgreBites::SdkTrayListener
{
public:
BaseApplication(void);
virtual ~BaseApplication(void);

virtual void go(void);

protected:
virtual bool setup();
virtual bool configure(void);
virtual void chooseSceneManager(void);
virtual void createCamera(void);
virtual void createFrameListener(void);
virtual void createScene(void) = 0; // Override me!
virtual void destroyScene(void);
virtual void createViewports(void);
virtual void setupResources(void);
virtual void createResourceListener(void);
virtual void loadResources(void);

// Ogre::FrameListener
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);

// OIS::KeyListener
virtual bool keyPressed( const OIS::KeyEvent &arg );
virtual bool keyReleased( const OIS::KeyEvent &arg );
// OIS::MouseListener
virtual bool mouseMoved( const OIS::MouseEvent &arg );
virtual bool mousePressed( const OIS::MouseEvent &arg, OIS::MouseButtonID id );
virtual bool mouseReleased( const OIS::MouseEvent &arg, OIS::MouseButtonID id );

// Ogre::WindowEventListener
//Adjust mouse clipping area
virtual void windowResized(Ogre::RenderWindow* rw);
//Unattach OIS before window shutdown (very important under Linux)
virtual void windowClosed(Ogre::RenderWindow* rw);

Ogre::Root *mRoot;
Ogre::Camera* mCamera;
Ogre::SceneManager* mSceneMgr;
Ogre::RenderWindow* mWindow;
Ogre::String mResourcesCfg;
Ogre::String mPluginsCfg;

// OgreBites
OgreBites::SdkTrayManager* mTrayMgr;
OgreBites::SdkCameraMan* mCameraMan; // basic camera controller
OgreBites::ParamsPanel* mDetailsPanel; // sample details panel
bool mCursorWasVisible; // was cursor visible before dialog appeared
bool mShutDown;

//OIS Input devices
OIS::InputManager* mInputManager;
OIS::Mouse* mMouse;
OIS::Keyboard* mKeyboard;


};

#endif // #ifndef __BaseApplication_h_

=================================================================================================================================

/*
-----------------------------------------------------------------------------
Filename: mitademo.h
-----------------------------------------------------------------------------
*/
#ifndef __mitademo_h_
#define __mitademo_h_

#include "BaseApplication.h"
#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
#include "../res/resource.h"
#endif

#include "mita.h" /**< @brief MITA SDK Header */
#ifdef _DEBUG
#pragma comment(lib, "mitaD.lib")
#else
#pragma comment(lib, "mita.lib")
#endif


using namespace Ogre;
using namespace OgreBites;

#define NUM_ANIMS 8 //角色动作数 //number of animations the character has
#define CHAR_HEIGHT 0.7 // 角色重心离地的高度 //height of character's center of mass above ground
#define CAM_HEIGHT 1 // 摄像机离角色重心的高度 //height of camera above character's center of mass
#define RUN_SPEED 15 // 角色每秒跑多少单位 //character running speed in units per second
#define TURN_SPEED 500.0f // 角色每秒转身角度// character turning in degrees per second
#define ANIM_FADE_SPEED 7.5f // 动作融合速度(每秒权重百分比) //animation crossfade speed in % of full weight per second
#define JUMP_ACCEL 3.0f // 角色向上跳跃加速度(单位/每二次方秒) //character jump acceleration in upward units per squared second
#define GRAVITY 9.8f // 引力(单位/每二次方秒) //gravity in downward units per squared second

class mitademo : public BaseApplication
{
private:
enum AnimID
{
ANIM_IDLE_BASE,
ANIM_IDLE_TOP,
ANIM_RUN_BASE,
ANIM_RUN_TOP,
ANIM_DANCE,
ANIM_JUMP_START,
ANIM_JUMP_LOOP,
ANIM_JUMP_END,
ANIM_NONE
};
void setupAnimations();
void setupCamera();
void updateBody(Real deltaTime);
void updateAnimations(Real deltaTime);
void fadeAnimations(Real deltaTime);
void updateCamera(Real deltaTime);
void updateCameraGoal(Real deltaYaw, Real deltaPitch, Real deltaZoom);
void setBaseAnimation(AnimID id, bool reset=false);
void setTopAnimation(AnimID id, bool reset=false);

SceneNode* mBodyNode;
SceneNode* mCameraPivot;
SceneNode* mCameraGoal;
SceneNode* mCameraNode;
Real mPivotPitch;
Entity* mBodyEnt;
AnimationState* mAnims[NUM_ANIMS]; // master animation list
AnimID mBaseAnimID; // current Body (full- or lower-body) animation
AnimID mTopAnimID; // current top (upper-body) animation
bool mFadingIn[NUM_ANIMS]; // which animations are fading in
bool mFadingOut[NUM_ANIMS]; // which animations are fading out

Vector3 mKeyDirection; // player's local intended direction Bodyd on WASD keys
Vector3 mGoalDirection; // actual intended direction in world-space
Real mVerticalVelocity; // for jumping
Real mTimer; // general timer to see how long animations have been playing


/
MITA
MITA_HINSTANCE gInstance;//实例 //instance
MITA_HINPUT speakerSound;//静止在地上的音响声音(音源输入) //Input a speaker sound
MITA_HINPUT f18Sound;//运动中f18战斗机声音(音源输入) //Input a F18 plane sound
MITA_HINPUT carSound;//运动中汽车声音(音源输入) //Input a car sound
MITA_HINPUT apacheSound;//静止在半空中直升机声音(音源输入) //Input a helicopter sound
MITA_DWORD ChannelMask;//通道掩码 //Channel mask
MITA_HOUTPUT hOutput;//输出 //Output
MITA_HENGINE hEngine;//引擎 //Engine
MITA_SIZE PluginCount;//插件数 //Numbers of plugins
MITA_HLISTENER hListener;//听者 //Listener
void initMitaDevice();//初始化mita设备 //init devices
void playSpMusic();//播放场景中音响的音乐 //play speaker sound
void playF18Sound();//播放场景中f18战斗机声音 //play F18 plane sound
void playCarSound();//播放场景中汽车声音 //play car sound
void playApacheSound();//播放场景中直升机声音 //play helicopter sound

MITA_STATIC
MITA_INLINE
MITA_HOUTPUT
MITA_CreateDefaultOutput(MITA_HINSTANCE hInstance, MITA_DWORD ChannelMask);//创建一个默认的输出 //create a default output

void mmaddTime(Real deltaTime);//角色动画动作等更新 //Character action update
void f18addTime(Real deltaTime);//f18战斗机动画更新 //F18 action update
void caraddTime(Real deltaTime);//汽车动画更新 //Car action update

//下面的变量用来在面板中显示位置方向等信息 //Show the info. about positions and directions.
MITA_FLOAT Posx;
MITA_FLOAT Posy;
MITA_FLOAT Posz;
MITA_FLOAT Directionx;
MITA_FLOAT Directiony;
MITA_FLOAT Directionz;

//用来记录角色朝向 //Character Orientation
Ogre::Vector3 charaOrientation;
//用来记录角色转到的角度 //Character Angle
Real mAngle;
/
public:
mitademo(void);
virtual ~mitademo(void);


protected:
virtual void createScene(void);
//下面这些用于缓冲输入
// OIS::KeyListener
virtual bool keyPressed( const OIS::KeyEvent& evt );
virtual bool keyReleased( const OIS::KeyEvent& evt );
// OIS::MouseListener
virtual bool mouseMoved( const OIS::MouseEvent& evt );
virtual bool mousePressed( const OIS::MouseEvent& evt, OIS::MouseButtonID id );
virtual bool mouseReleased( const OIS::MouseEvent& evt, OIS::MouseButtonID id );

Ogre::Real mRotate; // The rotate constant
Ogre::Real mMove; // The movement constant

Ogre::SceneNode *mCamNode; // The SceneNode the camera is currently attached to

Ogre::Vector3 mDirection; // Value to move in the correct direction
virtual bool frameRenderingQueued(const Ogre::FrameEvent& evt);
virtual void createFrameListener(void);

AnimationState* f18AnimState;
AnimationState* carAnimState;
};

#endif // #ifndef __mitademo_h_




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值