第六天:震耳欲聋
出自Ogre3D开放资源地带
目录 |
[编辑] 前言
如果你坚持看到了这一课,你会发现之前每一个章节里面我都会不忘掉给orz.ogre3d.cn以及bbs.ogre3d.cn做宣传。我一直希望可以让orz社区可以更受欢迎一些,但是目前还是很冷清。现在我在想一个定位问题,在bbs3.ogre3d.cn我们已有一个Ogre3d以及其他游戏技术的论坛,如果我们仍然吧orz社区作为一个注重技术的社区的话难免会内耗。所以目前我的设想是,相对于Ogre技术社区,我们兄弟社区Orz跟注重内容的创造。保持一些宅的问文化,保持一些参与的精神。恶搞,kuso,orz可能会成为我们的主流。
[编辑] 正文
我们书归正传,经过几天的努力,一个壮阔的宇宙战争展现在我们面前(虽然不怎么绚丽)。 但是,俗话说得好:没有声音,再好的游戏也出不来。
所以今天我们最重要的工作就是给游戏增加声音。
[编辑] TutorialDirector.h
//5这里提供一个背景音乐的智能指针 SoundPlayerPtr _bgm;
在游戏导演类中,我们增加一个背景音乐的智能指针。用于播放背景那个音乐。
[编辑] TutorialDirector.cpp
TutorialDirector::TutorialDirector(const std::string & name):Director(name)
,_plane()//1加入战斗机智能指针初始化(空)
,_enemy()
{
//5我们先设置音乐存放路径。
ISoundManager::getSingleton().setResourcesPath("../../media/sound/");
//5创建背景音乐音源,后面的参数代表是否采用“流”进行播放。
_bgm = ISoundManager::getSingleton().createPlayer("bgm.wma", true);
}
在进入整个插件的时候,我们把音频资源的路径设置为../../media/sound/,然后我们创建一个音频播放句柄,这里仍然使用了单件模式来得到音频管理器,并通过其创建了一个播放"bgm.wma"音频文件文件的句柄,并设置为"stream(流)"播放。
//0这个函数会在初始化调用
bool TutorialDirector::doEnable(void)
{
//这里省略一些以前的代码
//5载入音乐
_bgm->load();
//5循环播放,只要在播放参数中填入0或者小于0的参数,
//5音源就会循环播放,直到调用stop方法
_bgm->play(0);
return true;
}
在插件激活的时候,我们做了两件事情,通过load载入音乐,通过play播放音乐。这里需要注意一下,我们通过play方法传入一个参数,代表播放音频的次数,当这个数值小于等于0的时候,音频会不断循环播放下去。
//销毁之前调用
void TutorialDirector::doDisable(void)
{
//这里省略一些以前的代码
//5释放音源
_bgm->unload();
}
最后别忘了在后面释放音乐。
[编辑] EnemyPlanes.cpp
似乎播放声音的步骤有些复杂了,在某些情况下可能我们只需要让他“响”一下就好了。
看看下面,我们也提供了套餐服务。
void EnemyPlanes::attackEnemy(uint32 id)
{
//5这里我们使用了一个简单的播放音源接口,里面自动的载入,
//5播放一遍,并在每一次循环内检查是否播放完毕,如果播放完毕释放并销毁。
//5这种方法比较方便,但需要额外的系统消耗以及更少的可控性。
ISoundManager::getSingleton().quickPlay("boom.wav");
//这里省略了部分代码
}
在上面我们只需要一行代码就可以播放爆炸音效,系统会帮助我们创建,载入,播放一遍,卸载,释放整个流程的控制,虽然回增加些许系统的负担,不过对于编码来说省事不少,别忘了,易用性也是我们Orz引擎疯狂追求的特性之一。
[编辑] Bullets.h
[编辑] Bullets.cpp
在这两个文件里面我们同样提供了子弹发射音效的调用,教程里面就不废话再说一遍了。还是留给大家做课后作业用吧,对了,唯一的不同是我们在播放比较短的音效的时候,一般不用流地方法。
[编辑] 课程结语
啊,这么快就结束了。
今天的课程我们主要是使用了ISoundManager相关接口,它实现了对音频的封装,如果你看看源代码,可以发现其过分简单,以至于对立体声和3D音效没有任何支持。这是目前和Orz框架定位相关,Orz目前里面包含的大部分组件,更着重于开发单机版本休闲游戏,姑且认为目前ISoundManager简单接口足够使用。但请相信,Orz良好的扩展性可以很容易结合其他的音频实现。但是相对于自己实现,不如看看Ogre社区内提供的OgreFmod或者OgreAL音频插件,我相信可以解决你需要的大部分问题。
Orz至始至终都是以开放的心态而存在,如果不是有那么多良好的开源资源,Orz根本不可能存在。
