zoukankan      html  css  js  c++  java
  • C++播放wav音乐和音效

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

  • 相关阅读:
    [工作中的设计模式]中介模式模式Mediator
    [工作中的设计模式]责任链模式chain
    [工作中的设计模式]迭代子模式Iterator
    [工作中的设计模式]组合模式compnent
    TI IPNC Web网页之流程分析
    TI IPNC Web网页之GoDB开发环境
    安装ubuntu时将boot目录单独挂载的意义
    ubuntu添加自定义vga输出分辨率
    GCC编译默认的头文件搜索路径
    设置搜狗输入法在任何时候按左右两侧的shift激活
  • 原文地址:https://www.cnblogs.com/lzhitian/p/2347684.html
Copyright © 2011-2022 走看看