2.6 来点音乐
一般游戏为了解决枯燥的问题,通常还要加点音乐,好,我们也来加点音乐,其实并不是那么难,想其他所有的编程一样,无非是调用微软的API函数就可以完成了,书归正传
我们可以使用MCI来简易地实现在程序中播放MIDI和WAV等声音。使用它需要预先声明,我们需要在文件头#include <mmsystem.h>,并在工程中加入"winmm.lib"
下面先让我们看看播放MIDI的过程。首先我们要打开设备:
MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrDeviceType =
(LPCSTR) MCI_DEVTYPE_SEQUENCER; //是MIDI类型文件
OpenParms.lpstrElementName = (LPCSTR) filename; //文件名
OpenParms.wDeviceID = 0; //打开的设备的标识,后面需要使用
mciSendCommand (NULL, MCI_OPEN,
MCI_WAIT | MCI_OPEN_TYPE |
MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &OpenParms); //打开设备
接着就可以播放MIDI了:
MCI_PLAY_PARMS PlayParms;
PlayParms.dwFrom = 0; //从什么时间位置播放,单位为毫秒
mciSendCommand (DeviceID, MCI_PLAY, //DeviceID需等于上面的设备标识
MCI_FROM, (DWORD)(LPVOID)&PlayParms); //播放MIDI
停止播放:
mciSendCommand (DeviceID, MCI_STOP, NULL, NULL);
最后要关闭设备:
mciSendCommand (DeviceID, MCI_CLOSE, NULL, NULL);
打开WAV文件与打开MIDI文件的方法几乎完全相同,只是需要将MCI_DEVTYPE_SEQUENCER 改为MCI_DEVTYPE_WAVEFORM_AUDIO。
还是结合我们的demo来讲比较清楚一点,在我们的demo里面,我采用了仙剑奇侠传里面的一个比较经典的那个音乐,你听了一定会知道是哪一个(希望大宇公司不要告我侵权呀,借来用用而已呀^_^).我在地图初始化的时候就加载这段音乐,所以我写了一个void map::sound()函数.
void map::sound()
{
MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_SEQUENCER;
OpenParms.lpstrElementName = (LPCSTR) "0311.mid";//要播放的音乐文件名
OpenParms.wDeviceID = 0;
mciSendCommand (NULL, MCI_OPEN, MCI_WAIT | MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,(DWORD)(LPVOID) &OpenParms);
MCI_PLAY_PARMS PlayParms;
PlayParms.dwFrom = 0;
mciSendCommand (OpenParms.wDeviceID, MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&PlayParms);
}
其他的函数和语句前面介绍过了,不再累赘了.完成这些以后你就能在我的demo里面听到《仙剑奇侠传》的背景音乐了.
2.7 冒险去了
结合以上讲述的方法,再写一个好点的剧本,那么就可以冒险去了,于是我就有了现在的《理工冒险记》,虽然还有很多问题.但是勉强也算是一个单线情节的RPG,至于个中滋味,就要各位玩家自己亲身去体会了.这一节纯粹是游戏的宣传,没有一点技术含量,希望大家不要拿砖头砸我呀.
2.8 编后语
到这里,我想讲述的游戏编程的东东就基本上完了,但是必须要提醒大家的是,这只是沧海一粟,它本身是一个博大精深的东西,里面包含了无数前辈的智慧的结晶.随便找一本游戏编程的书来看看,你就知道,书中还提到:人工智能,游戏中的物理动作设计,动画制作, DirectSound,DirectInput,DirectPlay……,就是在图形显示部分都还有包含粒子应用,碰撞检测,地图卷轴技术……,举不胜举,这里特别有关于人工智能的一点要拿出来说一下:记得曾经一个老游戏程序员告诉我一句话,现在我转告给你们:"一个AI代表一个程序员的水平,程序员越聪明,就越能写出高明的计算机AI.",没有其他的意思,我比较喜欢这句话,所以就说给你们听.说了这么半天废话,我想要说的还是那句话,游戏编程是一个博大精深的领域,如果本文的阅读者有志于在这方面有所发展的话,强烈建议你买一本好书(怎么这个人没说几句话就又要买书啊,莫非真的是托?),花点时间好好看一看,动手写写code,那样的话,无论是你的编程水平,还是你做游戏的水平都会有一个质的提高.