第六天:震耳欲聋

出自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根本不可能存在。