我的恶魔城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);