消灭星星游戏程序设计【连载三】——游戏音乐的播放
大家每次都可以在页面中下载本节内容的实现代码,一步一步从简单开始,逐步完成游戏的各种功能。
游戏整体效果展示:
1、游戏中音效的使用
前面我们实现了图片的显示功能,是不是感觉到非常的简单。那么今天我们就继续说下游戏声音的实现。音效也是游戏的灵魂,只有搭配了美妙动听的音效以后,游戏才能令人耳目一新,与玩家产生良好的效果。
音效文件最常用的可分为两种,分别为.wav和.mp3后缀的文件,我们主要使用就是这两种音效文件。这里先简单的介绍下.wav文件的播放使用。
2、简单音效的播放
播放.wav音效文件最简单的播放声音方法就是直接调用VC++中提供的声音播放sndPlaySound函数,使用它就可以很方便的将文件中的声音播放出来,该函数具体使用方法如下:
sndPlaySound("sound/round_start.wav",SND_ASYNC);
那声音的播放,是不是也要跟文字和图像一样放在特定的位置呢?答案是不需要。你可以将声音的播放放在游戏过程中嗯任何时候。比如说,游戏开始运行时,玩家鼠标左键点击时,游戏通关时,按键被鼠标左键按下时等等。
3、音效在程序中的效果
那我们现在看一看,声音的播放都需要放在代码中的哪些地,我们可以在消息处理函数中添加以下一系列播放声音的动作。
游戏开始运行时:
case WM_CREATE:
sndPlaySound("sound/welcome.wav",SND_ASYNC);
return 0;
按下鼠标左键时:
case WM_LBUTTONDOWN:
sndPlaySound("sound/round_start.wav",SND_ASYNC);
return 0;
松开鼠标右键时:
case WM_RBUTTONUP:
sndPlaySound("sound/game_over.wav",SND_ASYNC);
return 0;
添加完以上代码并运行程序后,朋友们就可以直接感受到了音效的效果。效果如下:游戏在刚刚开始运行时就会播放出一个开场欢迎音乐(welcome.wav);当鼠标左键被按下时,会产生一个被游戏开始的音效效果(sound/round_start.wav);鼠标右键被松开时,会产生一个游戏结束的音效(game_over.wav)。这些音效立刻与玩家产生了良好的互动效果。
4、简单音效播放存在的问题
我们在使用上面介绍的操作音效方法过程中,发现虽然简单实现了我们对声音的需求,但使用效果并不够理想,主要存在两个问题:
第一个问题,上面介绍的音效操作只能播放.wav后缀的声音文件,无法播放.mp3后缀的声音文件。当使用sndPlaySound函数播放一个.mp3后缀的声音文件时,系统无法正常播放。
第二个问题,在连续播放2个以上的声音文件时,只能听到最后播放的声音文件,无法实现声音的叠加,这与游戏的特性需求不符。具体表现在,我们添加完上面的音效后,点击鼠标左键和鼠标右键后都会产生音效,但后面播放的声音会打断前面刚刚播放的音效。也就是说最后播放的声音会打断并停止此前播放的声音,可以简单的理解为单音道,始终只能播放一种声音音效。
5、高级的声音播放
发现了上面的问题后,我们寻求了更高级的声音播放方法。我们这里使用mciSendString这个函数,该函数可以完美的解决上面两个问题,既能播放.wav文件也能播放.mp3文件,同时可以实现多个声音同时播放的效果。该函数的使用也需要两步进行:
第一步:声音文件的加载
首先我们依然需要在程序消息函数处理WM_CREATE消息时加上以下语句,告诉系统需要加载音效文件的位置,同时给这个音效起个别名,字符串中alias后面就是别名,这里我们临时取名为round_start,以便后期使用。加载音效同样只用加载一次,后期使用无需多次加载。
//设置并加载声音资源,声音资源只用加载一次
mciSendString("open sound/round_start.wav alias round_start",NULL,0,NULL);
第二步:声音的播放
声音的播放依然非常的简单,直接使用的mciSendString函数,但需要注意的是,播放字符串中使用的音效资源别名round_start为刚刚第一步加载声音文件时我们自定义的别名。
//播放声音文件
mciSendString("play round_start from 0",NULL,0,NULL);
通过以上声音播放方式的改变,我们发现当点击鼠标左键和鼠标右键后,既能播放.wav文件也能播放.mp3文件,同时可以实现多个声音同时播放的叠加效果。
6、小结
本节中,我们已经掌握了声音显示的方法,比较完美解决了日常编程中声音的播放需求,当然使用mciSendString还可以实现更多的功能需求,例如设置、获取声音的音量大小,是否循环播放声音,获取声音是暂停还是播放状态,获取声音的播放时长等等,我们后期还会用到这些功能。