版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第10章 为引擎添加声音模块内容提纲 10.1资源交换文件格式10.2资源交换文件的操作10.2.1 打开与关闭10.2.2 文件的读写10.2.3 文件的定位10.3波形文件读取10.3.1 波形文件结构体10.3.2 编写波形文件读取类10.4波形文件播放10.4.1 DirectSound概述10.4.2 在开发环境中设置DirectX SDK10.4.3 DirectSound对象创建及初始化10.4.4 声音缓冲区的创建10.4.5 缓冲区声音的播放与控制10.5DirectSound操作类的创建10.5.1 AudioDXBuffer类的定义与实现10.5.2 AudioDX类的定
2、义与实现10.6为菜单类添加音效处理10.7声音模块应用实例10.8游戏引擎小结第10章 为引擎添加声音模块Windows游戏中,常用的声音格式是WAV格式,它的文件扩展名是.wav,支持从8KHz至44KHz的频率,可以保存单声道以及多声道的声音WAV(Waveform Audio File Format)格式即波形音频文件格式,是微软为Windows专门设计的多媒体文件格式之一微软还专门设计了另一种多媒体格式,AVI格式(Audio/Video Interleaved File Format,音频视频交互文件格式)微软将WAV格式和AVI格式称为资源交换文件格式(Resource Inte
3、rchange File Format, RIFF)微软为RIFF文件提供了专门的输入输出服务,也就是多媒体文件的输入与输出(MultiMedia file Input and Output, MMIO)10.1 资源交换文件格式RIFF文件由三部分组成:文件头、数据类型标识及块(Chunk)。块是RIFF文件的基本构成,每个块又有三个组成部分:(1)块类型标识,它是4字符代码如“RIFF”、“LIST”和“fmt”、“data”等(2)数据块字节大小;(3)数据本身10.1 资源交换文件格式RIFF文件中块的组成可以嵌套,块数据可以包含若干子块,子块又可包含各自的子块。RIFF文件本身就是一
4、个RIFF块,其数据可以是WAV子块或AVI子块。如果是包含的是WAV子块的话,WAV子块又可以包含自己的子块,如格式块(“fmt”)和数据块(“data”)等等。RIFF文件具有相同的结构,无论是WAV格式还是AVI格式,其结构都是一样的为了操作RIFF文件,微软在提供的多媒体软件开发包和多媒体输入输出API中,定义了专门的数据类型、结构以及宏。由于块类型标识是4字符代码,MMIO中专门定义了FOURCC数据类型,FOURCC就是FOUR Character Code的缩写,即四字符代码;另外还定义了mmioFOURCC宏,用来构造FOURCC类型;为了读写RIFF文件,MMIO中专门定义了
5、标准数据结构块MMCKINFO10.2 资源交换文件的操作10.2.1 打开与关闭打开RIFF文件可以使用mmioOpen函数该函数除了可以打开标准文件外,还可以打开内存文件。10.2.2 文件的读写要从RIFF文件中读取数据,需要使用mmioRead函数将数据写入RIFF文件,可以使用mmioWrite函数函数成功执行,将返回实际写入的字节数如果写入错误,返回值为-1。10.2 资源交换文件的操作10.2.3 文件的定位对于一个使用mmioOpen函数打开的文件,可以使用mmioSeek函数改变文件的当前位置该函数执行后,返回一个相对于文件头字节数的新位置如果执行出错,返回-1。mmioDe
6、scend函数可以进入RIFF文件块如果其返回值为MMSYSERR_NOERROR(= 0),表示函数执行成功否则可能的返回值为MMIOERR_CHUNKNOTFOUND。mmioAscend函数可从RIFF文件块中移出函数返回值为MMSYSERR_NOERROR(= 0),表示成功执行否则返回值为MMIOERR_CANNOTSEEK或MMIOERR_CANNOTWRITE10.3 波形文件读取波形文件是一种数字文件,其特点是能够较好地还原原始声源的效果。在音乐、歌曲的录制时,常常采用波形文件格式。WAV格式已经获得Windows平台及Windows应用程序的广泛支持,它可以采用多种压缩算法,
7、而且支持多种音频位数、采样频率以及不同的声道。如果采用44.1kHz的采样频率和16位的量化位数,其音质与CD不相上下。波形文件格式除了WAV格式,有时还会采用AU格式或VOC格式等。10.3 波形文件读取10.3.1 波形文件结构体WAVE格式的文件是由WAVEFORMATEX结构体来描述的,这个结构定义了WAVE音频数据的格式该结构体的原型定义如下:WAVEFORMATEX WORD wFormatTag; WORD nChannels; DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPer
8、Sample; WORD cbSize;10.3 波形文件读取10.3.2 编写波形文件读取类将WAVE格式的文件读取操作采用类的形式进行封装,类名就命名为AudioWave将声音模块文件命名为T_Audio,要创建的两个文件分别是T_Audio.h头文件和T_Audio.cpp源文件AudioWave类的定义和具体代码请参见教程10.4 波形文件播放在Windows多媒体API中提供了三种方式来播放.wav格式的声音:第一种方式:调用Win32 API函数PlaySound();不过该函数必须将声音数据完全加载至物理内存才能播放,比较适合播放100KB以下的文件,而且数据格式必须被配置的音频
9、驱动所支持;第二种方式:采用媒体控制接口(The Media Control Interface, MCI);它提供了高级的媒体设备接口的控制能力,不仅可以播放.wav文件,还可以播放MIDI及CD音频;在使用方面也比较简单,通过发送不同的MCI命令,就可以让设备完成各种功能,而无需关心设备内部的实现。10.4 波形文件播放以上两种方式有一个共同的缺点:那就是无法同时播放两个或两个以上的.wav文件同时播放两个以上的声音,有时是游戏的需要,如在播放背景音乐的同时播放不同游戏角色的音效声音以上两种方式尽管相对简单,但无法满足需求第三种方式:DirectSound方式;它能实现八个及八个以上.wa
10、v文件的同时播放,能很好地满足游戏的需求。10.4 波形文件播放10.4.1 DirectSound概述 DirectSound是由微软开发的多媒体接口方案DirectX的组成部分之一。DirectX由众多API组成,这些API按照性质可以分为四大部分:显示部分声音部分输入部分网络部分具体来说包含:Direct Graphics ( 包括Direct 3D和Direct Draw )Direct InputDirect PlayDirect SoundDirect ShowDirect SetupDirect Media Objects等多个组件10.4 波形文件播放其中声音部分最主要的API
11、就是DirectSound,它除了声音播放和混音处理外,还加强了3D音效,并提供了录音功能。DirectSound需要用到mmsystem.h和dsound.h两个头文件,具体代码实现时需要在头文件中包含它们。DirectSound的功能模块包括回放、声音缓冲区、三维音效、音频捕获、属性集等。回放功能:IDirectSound接口声音缓冲区:IDirectSoundBuffer接口三维音效:IDirectSound3DBuffer和IDirectSound3DListener接口音频捕获:IDirectSoundCapture和IDirectSoundCaptureBuffer接口10.4 波
12、形文件播放音频播放或捕获时到达一定位置,需要产生一个事件,使用IDirectSoundNotify接口:例如:当播放结束时,DirectSound通过IDirectSoundNotify接口可以动态地通知应用程序这一事件DirectSound属性集由专门的结构体类型描述:描述缓冲区属性的DSBUFFERDESC就是这样的结构体类型10.4 波形文件播放DirectSound的播放需要在DirectSound缓冲区中完成,而缓冲区中的声音数据必须是PCM(Pulse Code Modulation, 脉冲编码调制)格式。DirectSound缓冲区对象不仅具备声音播放、停止或暂停功能,还能够设置
13、声音数据的属性,如频率、格式等。DirectSound缓冲区分为主缓冲区和辅助缓冲区。主缓冲区中是最终播放的声音,它是将辅助缓冲区中的声音进行混音后得到的结果。而辅助缓冲区中存放单独的声音信号,有的能直接播放,有的需要混音,而有的则可以循环播放。主缓冲区由DirectSound自动创建,而辅助缓冲区需由应用程序来创建。DirectSound将辅助缓冲区中的声音混合后,存入主缓冲区,再输出到相应播放设备。10.4 波形文件播放多个应用程序可以用同一声音设备来创建DirectSound对象当应用程序的输入焦点发生变化时,音频输出将自动在应用程序之间切换10.4.2 在开发环境中设置DirectX
14、SDK 具体内容请参考教程10.4 波形文件播放10.4.3 DirectSound对象创建及初始化游戏中主要使用声音播放及播放控制功能,只重点涉及IDirectSound和IDirectSoundBuffer接口的应用。DirectSound对象创建和初始化需要使用DirectSoundCreate函数;成功创建DirectSound对象后,必须紧接着调用SetCooperativeLevel函数设置DirectSound对象的合作级别。10.4 波形文件播放10.4.4 声音缓冲区的创建初始化完成后,DirectSound将自动创建主缓冲区用于混音,辅助缓冲区则需要由编程人员来创建;要创建
15、声音缓冲区对象,需要两个对象来保存创建后的结果:DSBUFFERDESC对象:这是一个结构体,它描述声音缓冲区对象的属性;LPDIRECTSOUNDBUFFER对象:这一个IDirectSoundBuffer接口的指针,用来对声音缓冲区进行操作定义了DSBUFFERDESC和LPDIRECTSOUNDBUFFER两个对象变量后,就可以调用CreateSoundBuffer函数创建一个新的声音缓冲区对象10.4 波形文件播放10.4.5 缓冲区声音的播放与控制DirectSound缓冲区成功创建后,就可以调用Play()函数进行声音的播放,调用Stop()函数停止声音的播放。10.5 Direc
16、tSound操作类的创建DirectSound功能强大,但实现起来有一定复杂度其中涉及的对象、接口以及属性比较多;游戏声音播放的代码相对于游戏中的其它代码,独立性较强;对DirectSound的操作以独立文件及独立类的形式进行封装,从而便于代码的管理,同时也达到了代码重用的目的在设计DirectSound操作类时,需要考虑DirectSound操作的三个方面的需求:DirectSound对象(IDirectSound接口指针)的管理缓冲区(IDirectSoundBuffer接口指针)的管理WAVE文件的读取。10.5 DirectSound操作类的创建这三个方面在管理上相互独立,但实际应用时
17、又互相调用,因此在类的实现上可以设计3个单独的类,可以将这3个类分别命名为:AudioDXBuffer:管理缓冲区AudioDX:管理DirectSound对象AudioWave:管理WAVE文件AudioWave类已经在前面实现出来了由于以上3个类代码都比较短,为了便于引用和管理,这3个类的定义代码都在T_Audio.h头文件中编写,它们对应的函数实现代码都在T_Audio.cpp源文件中编写。10.5 DirectSound操作类的创建为了使用DirectSound对象,还要在T_Audio.h头文件中的预编译处理部分增加对DirectX相关的头文件和静态库文件的引用,具体要添加的代码如下
18、:#include #pragma comment(lib, dxguid.lib)#pragma comment(lib, dsound.lib)class AudioDX; /由于要先引用,所以需先声明后定义以上4行代码添加到原来头文件引用代码的后面其中第4行代码先声明AudioDX类,因为在AudioDXBuffer类中会先对该类进行引用,而AudioDX类的定义代码在AudioDXBuffer类之后。在T_Audio.h头文件中AudioWave类的定义代码后面,增加AudioDXBuffer类和AudioDX类的定义代码。10.5 DirectSound操作类的创建10.5.1 Au
19、dioDXBuffer类的定义与实现具体定义和实现代码请参见教程10.5.2 AudioDX类的定义与实现具体定义和实现代码请参见教程T_Audio模块与其它模块不同之处:该模块中包含3个相互调用的类:AudioDXBuffer类、AudioDX类以及AudioWave类模块名为T_Audio,却没有T_Audio这个类,应用时需要注意利用T_Audio模块,可以处理:加载波形文件,实现多种声音混合播放,可以随时终止播放播放时还可以选择循环播放还是只播放一次对于一般小游戏开发来说,如果对声音处理要求不高的话,本模块足以满足需求。10.6 为菜单类添加音效处理利用T_Audio模块为T_Menu
20、菜单类添加菜单项音效处理:添加的音效是针对T_Menu类的菜单项的。在此只添加两种音效处理:(1)鼠标在菜单项上移过的音效;(2)菜单项被点击时的音效。具体要添加的代码请参见教程10.7 声音模块应用实例利用声音模块为在上一章例9-1的副本项目,添加背景音乐播放和角色行走音效,同时测试上述菜单类中添加的音效处理代码的效果。首先需要准备4个WAVA格式的游戏声音素材:(1)背景音乐:文件名为backmusic.wav;(2)行走音效:文件名为robot.wav;(3)鼠标移动音效:文件名为mouseover.wav;(4)鼠标点击音效:文件名为mousedown.wav。以上4个文件保存在项目的
21、sound目录中具体实现代码请参见教程或代码工程10.7 声音模块应用实例运行结果:这是菜单界面下的运行截图程序启动后,背景音乐就会自动开始循环播放。当鼠标在菜单界面上移动,如果经过的地方有菜单项,即界面上黄色的按钮,将播放鼠标移动音效;如果点击某个菜单项,将播放鼠标点击音效。点击“新游戏”菜单项,将进入游戏界面,背景音乐仍然在继续播放,如果按上、下、左、右方向键,角色将会朝对应的方向移动,角色在移动时会播放行走音效。10.8 游戏引擎小结到现在为止,已经完成了TinyEngine游戏引擎全部模块文件的编写整个引擎文件共有11个类,22个文件T_Config.h引擎共用的头文件,其中包含了本引
22、擎用到的数据结构定义、常量定义,并包含了所需的系统头文件T_Display.h、T_Display.cpp处理游戏窗口分辨率的简单类T_Engine.h、T_Engine.cpp本游戏引擎核心类,也是专门用于派生的抽象类。它负责游戏窗口处理、消息处理、接口函数调用以及游戏循环处理等该类提供了本引擎使用框架,其中定义了GameInit()、GameLogic()、GameEnd()、GamePaint()、GameKeyAction()和GameMouseAction()六个纯虚接口函数任何使用TinyEngine的类必须首先从T_Engine类派生,重载六个纯虚接口函数,并为它们提供具体的实现代码10.8 游戏引擎小结T_Graph.h、T_Graph.cpp图形类,游戏引擎核心类之一,负责图像加载、图像显示、动画绘制以及文字显示等。T_Menu.h、T_Menu.cpp菜单类,专门处理游戏开始界面和过渡界面的菜单,菜单项可以是纯文字方式,也可以是图片方式,具体菜单项和
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026中国体育用品行业市场竞争分析发展前景评估投资规划分析研究报告
- 2026中国食品饮料行业消费趋势与技术创新研究分析报告
- 平台经济二选一反垄断处罚对市场新进入者生存概率的释放机制-基于行政处罚法在互联网领域适用后市场份额变化的量化回归生存分析
- 2026农业农业技术应用现状特点及推广计划研究报告
- 2026中国智能农业无人机行业市场供需分析及投资评估与发展规划报告
- 2026区块链技术应用场景供应链发展分析解读
- 2026人工智能指数报告
- 2026中国印刷行业市场发展需求分析及投资评估规划分析研究报告
- 2026山河摄影行业市场现状供需分析及投资评估规划分析研究报告
- 临床眼科手术从术前准备到术后护理注意事项
- 2026年聚甲醛行业创新分析报告
- 2026湖北黄石市阳新县事业单位统一招聘107人笔试备考题库及答案详解
- 2026下半年四川成都市大邑县教育系统招聘编外教师教师146人笔试题库附答案详解(轻巧夺冠)
- 中国重症康复指南(2024年版)
- 宁德市福安市2026学年数学三年级下学期期末综合测试试题(含答案)
- GA/T 1043-2025智能交通管理系统前端设备运行维护规范
- (高清版)DB31∕T 1083-2025 公共停车信息联网技术要求
- 供应商来料包装规范-
- GB∕T 2567-2021 树脂浇铸体性能试验方法
- Q∕SY 04797-2020 燃油加油机应用规范
- 2019译林版高中英语必修三单词默写表
评论
0/150
提交评论