博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++播放wav音乐和音效
阅读量:5788 次
发布时间:2019-06-18

本文共 2913 字,大约阅读时间需要 9 分钟。

我的恶魔城BOSS关的代码基本上快完成了,虽然还有许多恼人的细节需要完善,比如血槽拉,跳跃攻击拉,Game over的画面拉,Boss出现和死亡后的过场啦。本来想在全部完成后把全部代码贴上来做纪念,但是已经有点迫不及待了。毕竟编了3个月,是我一边打工,一边准备考试的艰难岁月的留念。

我曾经把它想象成一个咒语:当我把全部代码写完的时候,我的I-20表格就会寄到,也可以顺利入学。现在I-20表格还在路上,而软工9月3日才开学。好担心啊,现在把这些代码贴上来,希望它们可以保佑我。                        

编完这个游戏就表明我的2D的ARPG的编程就可以过关一部分了。虽然我还很菜,进展也满慢的,但是也是会了一些东西拉。技术突破不是很多,会使用ATI的结构,会用C++贴图,明白时间间隔的原理即可。比较大的技术问题是如何播放声音,在网上查了好久发现也没有一端可以使用的完整代码,大多数文章综合性很强,但是使用的代码的方法却一代而过,很不适合我这样的菜鸟。所以咬咬牙把书上如何使用directsound的章节看了,我把类封装的代码去掉了,综合了一下发现竟然可以顺利播放,虽然我不能解释每句代码的意思,但是对于菜鸟这样就够了。

Directsound比soundplay()好的地方就是可以混音,就是可以同时播放几种声音,这样就可以在播放背景音乐的时候播放音效了。

首先,将下面的库添加到工程中comctl32.lib dxerr9.lib winmm.lib dsound.lib dxguid.lib odbc32.lib odbccp32.lib。(不是都用的到)

在头文件中添加:

#include <mmsystem.h>

#include <dsound.h>

在窗口程序中添加:

//全局变量声明中添加

//==============directsound相关变量=========================

LPDIRECTSOUND pDS; //声明DirectSound对象指针,声明主缓冲区指针,声明次级缓冲区指针

HRESULT result; //声明HRESULT类型变量
LPDIRECTSOUNDBUFFER pPBuf,pSBuf[3];
DSBUFFERDESC desc; //声明描述结构
MMCKINFO ckRiff,ckInfo; //Riff区块和子区块的信息
MMRESULT mmresult;
HMMIO hmmio; //打开的多媒体文件
DWORD size,bytesAudio; //实际资料的大小,存储区要存入资料的长度
LPVOID pAudio; //指向缓冲区开始记录资料的地址
WAVEFORMATEX swfmt;

//在BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)函数中添加

//=====================directsound初始化==================

result=DirectSoundCreate(NULL,&pDS,NULL); //建立DirectSound对象

result=pDS->SetCooperativeLevel(hWnd,DSSCL_PRIORITY); //hWnd为应用程序主窗口

memset(&desc,0,sizeof(desc)); //清空结构内容

desc.dwSize=sizeof(desc);
desc.dwFlags=DSBCAPS_PRIMARYBUFFER;
desc.dwBufferBytes=0;
desc.lpwfxFormat=NULL;
result=pDS->CreateSoundBuffer(&desc,&pPBuf,NULL);
pSBuf[0]=CreateBuffer("wing.wav"); //要播放的wav文件,煽动翅膀的音效
pSBuf[1]=CreateBuffer("thunder.wav"); //打雷音效
pSBuf[2]=CreateBuffer("thunder.wav"); //打雷2音效

//*****************自定义函数*********************

LPDIRECTSOUNDBUFFER CreateBuffer(char * filename)

{
LPDIRECTSOUNDBUFFER buf;
hmmio = mmioOpen(filename, NULL, MMIO_ALLOCBUF|MMIO_READ );
ckRiff.fccType = mmioFOURCC('W', 'A', 'V', 'E');
mmresult = mmioDescend(hmmio,&ckRiff,NULL,MMIO_FINDRIFF);

ckInfo.ckid = mmioFOURCC('f','m','t',' ');

mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
mmioRead(hmmio,(HPSTR)&swfmt,sizeof(swfmt));
mmresult = mmioAscend(hmmio,&ckInfo,0);
ckInfo.ckid = mmioFOURCC('d','a','t','a');
mmresult = mmioDescend(hmmio,&ckInfo,&ckRiff,MMIO_FINDCHUNK);
size = ckInfo.cksize;
memset( &desc,0,sizeof(desc));
desc.dwSize = sizeof(desc);
desc.dwFlags = DSBCAPS_STATIC |DSBCAPS_CTRLPAN |DSBCAPS_CTRLVOLUME| DSBCAPS_GLOBALFOCUS;
desc.dwBufferBytes = size;
desc.lpwfxFormat = &swfmt;
result = pDS->CreateSoundBuffer( &desc, &buf, NULL );

result = buf->Lock(0,size,&pAudio,&bytesAudio,NULL,NULL,NULL);

mmresult = mmioRead(hmmio,(HPSTR)pAudio,bytesAudio);
result = buf->Unlock(pAudio,bytesAudio,NULL,NULL);
mmioClose(hmmio,0);
return buf;
}

之后,比如需要播放扇动翅膀的音效,就在需要播放音乐或者音效的地方加入 pSBuf[1]->Play(0,0,0);

 

转载于:https://www.cnblogs.com/lzhitian/archive/2012/02/12/2347684.html

你可能感兴趣的文章
mysql 主从
查看>>
SDUT-2054_数据结构实验之链表九:双向链表
查看>>
Java练习 SDUT-3338_计算各种图形的周长(接口与多态)
查看>>
php private ,public protected三者的区别
查看>>
vim---C++开发环境搭建
查看>>
poj 3485 区间选点
查看>>
好吧,我在这里!
查看>>
团队开发介绍
查看>>
史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)
查看>>
Oracle创建用户、角色、授权、建表
查看>>
Oracle Validated Configurations 安装使用 说明
查看>>
SDN环境搭建(mininet,OVS,ryu安装及命令)
查看>>
CSS后续知识点
查看>>
视频图像处理基础知识0(双线性插值算法进行图像缩放)【转】
查看>>
c语言中基本数据类型printf()对应格式
查看>>
如何保证缓存与数据库的双写一致性?
查看>>
Jar运行的几个方法
查看>>
验证二叉搜索树的golang实现
查看>>
读书笔记《自控力》
查看>>
浅议.NET、ASP.NET和C#的关系
查看>>