餐飲公司的網(wǎng)站建設(shè)鄭州高端網(wǎng)站制作
版本:VS2015 語言:C++
最近項(xiàng)目遭遇變故,公司隨意開人,導(dǎo)致原本要出包的項(xiàng)目現(xiàn)在亂七八糟。現(xiàn)在不知道未來會怎么樣……
我們Windows上2D的編程今天是最后一課了,沒有聽錯,2D完結(jié),接下來就是3D了,書已經(jīng)準(zhǔn)備好了,就等我回去去取,有沒有點(diǎn)小興奮呢?嘛,我現(xiàn)在是還沒有接觸過3D引擎啦,不過等學(xué)完再去看看Unreal豈不也是美哉。
今天要講的是在dx中演奏音樂和音效,沒看這個章節(jié)前,我一直認(rèn)為音樂和音效的區(qū)別主要是播發(fā)時間長短的問題,實(shí)際一看,這里面十分的玄妙。
有一點(diǎn)先說一下,相比于圖形技術(shù)的更新?lián)Q代,音樂技術(shù)沒有發(fā)生過多大的變化,dx3開始一直到dx7的時候,都是使用dx3的接口。直到dx8才把Sound和Music整合成了Audio。
那么音樂(Music)和音效(Sound)究竟有什么區(qū)別呢?
所謂Sound,專業(yè)點(diǎn)來說就是數(shù)字化的數(shù)碼聲音。比如你買了個麥克風(fēng),你干吼幾下,然后錄音軟件把你的聲音記錄成了一個文件,那個文件就是音效了(很滲人啊)。
而Music是合成音,直接取締了錄音的階段,用戶直接編入數(shù)據(jù),讓音頻發(fā)生庫發(fā)出數(shù)據(jù)所代表的音樂。
文件格式上來說,Sound代表格式是WAV,而Music是MIDI。
了解了這一些就知道為什么要分成DSound和DMusic了。好了下面是一個實(shí)際的程序,先我們使用老接口的Sound來播放一個音效。
申明一下,這里工程中的基礎(chǔ)代碼是上一節(jié)使用過代碼,有需要的玩家可以看一下dxinput的內(nèi)容。
首先需要引入dsound.lib和winmm.lib,但后者是windows部分用于讀取媒體文件,所以只需要使用vs自帶的lib就OK了。
然后引入頭文件#include <mmsystem.h> #include "dsound.h"這兩個。
環(huán)境搞定之后,下面是編寫一些全局代碼,做一些準(zhǔn)備工作:
LPDIRECTSOUND lpds; //dx音效對象
DSBUFFERDESC dsbd; //音效緩存描述// WAV文件讀入后存放的類
typedef struct pcm_sound_typ
{LPDIRECTSOUNDBUFFER dsbuffer;int state;int rate;int size;int id;
}pcm_sound, *pcm_sound_ptr;#define SOUND_NULL 0
#define SOUND_LOADED 1const int MAX_SOUNDS = 10; //最多存放音效的數(shù)量
pcm_sound sound_fx[MAX_SOUNDS]; //所有的音效
然后我們要實(shí)現(xiàn)的效果就是在游戲初始化的時候讀取一個文件,并播放,我看了一下就選wind.wav這個風(fēng)的音效(不知道從哪錄的,怪滲人的)。
下面是初始化并播放的代碼:
// 開始創(chuàng)建音效對象
if (DirectSoundCreate(NULL, &lpds, NULL)!=DS_OK)
{popMessage(TEXT("創(chuàng)建音效對象失敗"));return 0;
}if (FAILED(lpds->SetCooperativeLevel(main_window_handle, DSSCL_NORMAL))) //設(shè)置普通的協(xié)作等級
{popMessage(TE