在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

游戲音樂與音效的播放

游戲音樂與音效的播放

更新時間:2021-11-16 文章作者:未知 信息來源:網絡 閱讀次數:

在Win32環境下,播放音樂音效的方法太多了,而且有一個共同點就是:你不需要花很大的心力就可以得到你需要的東西。延續主題式的探討,這一期我們著重在音樂與音效的播放。

□ 游戲的配樂

我相信很多人一定同意音樂在游戲里面所占的地位,回想一下國內RPG的經典「仙劍奇俠傳」,剝掉音樂這一個層面,整個游戲將會遜色不少,尤其適當的場景搭配適當的音樂,更能讓玩家融入劇情當中。該哭的時候哭,該笑的時候笑,大概就很切中要領了。RPG剩下的音效部份,并不特別突出,大抵上知道砍人的時候有揮劍的聲音就可以了,所以在音效的表現方面,通常比較不那麼注重。而即時戰斗的游戲著重在廝殺的音效表現上,一大片人馬,一片混雜的聲音,這其中牽涉到混音的部份,我們底下也會探討到。讀完這篇文章,你會學習到什麼時候該用什麼樣的程式作法來表現游戲的另一個生命:音樂與音效。

□ 從MIDI開始

早期DOS下的音樂部份,大多數采用聲霸卡的規格,副檔名為CMF者便是這種格式,當然游戲通常不會讓你看到真正的作法,但是內部采用這種格式居多是無庸置疑的。而WINDOW下的游戲以光碟發行者居多,為了充分達到空間利用的階段,游戲中會大量使用WAV格式的檔案,或是直接將音樂燒成音軌的格式。尤其很多游戲喜歡采用第一片資料片,第二片音樂片的作法,平常不玩游戲還可以當成音樂CD來聽,算是滿有質感的一件事。當然,我的意思是這些音樂必須要聲聲入耳,如果音樂本身庸庸碌碌的,即使燒成音軌,一樣是庸庸碌碌,改變不了這個事實。

在WINDOW下,考量到空間的大小,MIDI格式的音樂檔絕對是最佳的選擇,一首五分鐘的MIDI了不起十萬字元的大小,這跟WAV格式一分鐘占用量以MB計,簡直是小巫見大巫,所以網站上的音樂,游戲的音樂,都很適合用MIDI來表現,而音樂部份我個人注重旋律,至於一首音樂本身使用到的樂器數量,我倒是很少去注意,人的耳朵聽東西有一定的極限,只要不產生雜音,配合優美的旋律,大致上都可以接受。

□ 播放MIDI的程式作法

游戲中播放音樂的要點就是循環播放,也就是播放完畢以後,要讓他從頭開始播放,直到場景更換,或是游戲結束為止。所以當MIDI檔案播放完畢以後,必須要能通知程式,讓程式做出適當的處理。播放MIDI的作法只要藉由WINDOW的多媒體的支援,馬上就搞定了,甚至直接從HELP的作法剪過來,稍微修改一下,也能符合需要,因為這種東西相當公式化,A君和B君寫出來的程式碼也大致上會長得差不多,廢話不多說,看看程式多麼簡單便是:

class CMidi

{

public:

    DWORD Play(HWND,char* FileName);

    void Replay();

    void Stop();

    private:

    UINT wDeviceID;//MCI裝置代號

    DWORD dwReturn;

    MCI_OPEN_PARMS mciOpenParms;

    MCI_PLAY_PARMS mciPlayParms;

    MCI_STATUS_PARMS mciStatusParms;

    MCI_SEQ_SET_PARMS mciSeqSetParms;

};

將他包裝成一個類別來使用也可以,而介面的部份需要單純化,從直覺上來說,第一個動作就是播放(Play),接著是重播(Replay),最後當然是善後的工作了(Stop),不多不少,剛好三個,當然你會想到,是不是需要一個暫停的介面,沒問題,這不是什麼難事,花額外的三分鐘應該可以勝任愉快。

了解類別大致上的長相以後,讓我們來看看實作的部份是怎麼一回事,先從CMidi::Play()開始:

DWORD CMidi::Play(HWND hwnd,char* MidiFile)

{

    // 開啟Midi的硬體裝置,我們使用一般內定值

    mciOpenParms.lpstrDeviceType = "sequencer";

    //這個叁數就是要播放的MIDI檔案名稱

    mciOpenParms.lpstrElementName = MidiFile;

    // 使用Message的方式來播放MIDI而不是STRING的方式

    if (dwReturn = mciSendCommand(NULL, MCI_OPEN,

    MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,

    (DWORD)(LPVOID) &mciOpenParms)

    return (dwReturn);

    // The device opened successfully; get the device ID.

    wDeviceID = mciOpenParms.wDeviceID;

    // Check if the output port is the MIDI mapper.

    mciStatusParms.dwItem = MCI_SEQ_STATUS_PORT;

    if (dwReturn = mciSendCommand(wDeviceID, MCI_STATUS,

        MCI_STATUS_ITEM, (DWORD)(LPVOID) &mciStatusParms))

        {

            mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

            return (dwReturn);

        }

        // 為了達成重復播放的目的,必須讓我們的程式能夠接收到

        // MM_MCINOTIFY的訊息,這個函示呼叫的方式,就是傳遞

        // WM_PLAY訊息給裝置,叫他開始播放。

        mciPlayParms.dwCallback = (DWORD) hwnd;

        if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY,

        (DWORD)(LPVOID) &mciPlayParms))

        {

            mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

            return (dwReturn);

        }

    return (0L);

};

播放MIDI的方式有兩種,第一種是利用字串命令硬體動作,第二種是傳遞訊息的方式,我們采用第二種,原因很清楚了,必須透過訊息的傳遞,我們才能得知音樂是否播放完畢了。

接下來我們看看Cmidi::Replay是怎麼一回事:

void CMidi::Replay()

{

        mciSendCommand(wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);

        mciSendCommand(wDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD)(LPVOID) &mciPlayParms);

}

真是不可思議地簡單呀,函示里面只包含兩條呼叫,第一條呼叫送訊息給裝置,叫他把MIDI的播放指標移到最開頭的部份,也就是MCI_SEEK_TO_START,

作法就像移動檔案指標一樣。接著第二條指令光看也明白,就是叫他繼續播放就是了,而且別忘了MCI_NOTIFY,當下次播放完畢,還是得用訊息通知我們的程式。

最後看一下Cmidi::Stop()的作法:

void CMidi::Stop()

{

    mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL);

}

越來越單純了,里面只有包含一個函示呼叫,其中的訊息叁數MCI_CLOSE,就是結束整個音樂的播放。當你結束播放以後,要播放另一首音樂,很簡單,再次呼叫Cmidi::Play()即可。

整個類別的使用方法大致上是這樣的:首先配置一個實際的CMidi物件給程式,只要在全域的地方下條指令 CMidi midi;即可,爾後midi就是真實的物件了。在場景初始化的部份呼叫midi.Play(hwnd,"ff3celes.mid");,輸入正確的MIDI檔名即可。此處我播放的是太空戰士三代的音樂,只是示范一下,當然這首音樂確實很棒就是了。而在訊息回圈里面,我們必須定義一個訊息:

case MM_MCINOTIFY:

    midi.Replay();

    break;

在音樂播放完畢以後,我們的訊息回圈會收到MM_MCINOTIFY這個訊息,這時候如同我們前面所言,呼叫Cmidi::Replay()即可。而當場景更換,要重新一首新的音樂,或是程式結束的時候,就是呼叫Cmidi::Stop()的時機。因為一個場景同時間只會存在一首音樂,所以我們的類別表現良好,不用擔心。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 欧美日韩亚洲一二三| 欧美极品少妇无套实战| 嫩草影院中文字幕| 中文字幕第80页| 久久久一本二本三本| 亚洲天堂第一区| 亚洲免费在线播放视频| 亚洲欧美自偷自拍另类| 88av.com| 免费看涩涩视频| 成人三级视频在线播放| 久久成人免费观看| 免费看国产一级片| 黄页网站大全在线观看| 成年人看的毛片| 亚洲不卡中文字幕无码| 99视频在线免费播放| 黄色一级视频片| 精品少妇一区二区三区在线| 免费观看美女裸体网站| 免费看一级大黄情大片| 激情婷婷综合网| 91n.com在线观看| 亚洲欧美日本一区二区| 香蕉视频在线网址| 日韩成人三级视频| 国内自拍在线观看| 少妇性l交大片| 一区二区久久精品| 国产va亚洲va在线va| 欧美成人xxxxx| 亚洲欧美日韩精品一区| 台湾无码一区二区| 免费午夜视频在线观看| 中文字幕第三区| 免费欧美一级视频| 在线看免费毛片| 日韩欧美一区二| 永久免费的av网站| 91丨porny丨探花| 手机在线免费观看毛片| 蜜臀av.com| 五月天婷婷激情视频| 精品嫩模一区二区三区| 久久精品香蕉视频| 一本—道久久a久久精品蜜桃| 国产精品成人久久电影| 日日干夜夜操s8| 99热自拍偷拍| 日韩不卡视频一区二区| 亚洲福利精品视频| 日韩欧美国产综合在线| 国产5g成人5g天天爽| 免费午夜视频在线观看| 日韩中文字幕亚洲精品欧美| 91小视频网站| 欧美少妇性生活视频| 久久精品国产sm调教网站演员| 一区二区三区欧美精品| 日本www高清视频| 亚洲国产精品成人天堂| 97精品国产97久久久久久粉红| 一区二区成人网| 国产日产欧美视频| 欧美这里只有精品| 国产卡一卡二在线| 亚洲欧美日本一区二区三区| 看欧美ab黄色大片视频免费| 男人天堂999| 激情伊人五月天| 极品粉嫩国产18尤物| 国产又粗又爽又黄的视频| 国产传媒免费观看| 岛国av免费在线| 网站在线你懂的| 亚洲男人天堂2021| 日韩a一级欧美一级| 一级黄色高清视频| 天堂av免费看| 屁屁影院ccyy国产第一页| 污污污污污污www网站免费| 四虎4hu永久免费入口| 欧美一级爱爱视频| 欧美黑人经典片免费观看| 2018中文字幕第一页| 日韩欧美一区二| 狠狠热免费视频| 伊人五月天婷婷| 久久天天东北熟女毛茸茸| 国产精品69久久久| 日本在线视频www| 国产又黄又猛的视频| 中文字幕av久久| 欧美精品卡一卡二| 国产一级特黄a大片免费| 亚洲图色中文字幕| 欧洲精品一区二区三区久久| 日韩a∨精品日韩在线观看| 青青视频在线播放| 色噜噜狠狠一区二区| 国产专区在线视频| 国产极品美女高潮无套久久久| 另类小说第一页| 国产乱人伦精品一区二区三区| 亚洲午夜无码av毛片久久| 在线观看日本一区二区| 国产九色porny| 色婷婷狠狠18| 99久久国产综合精品五月天喷水| 国产精品99久久免费黑人人妻| 男女视频在线观看网站| 久久视频这里有精品| 亚洲制服中文字幕| 黄色a级片免费| 黄色网在线视频| 在线观看免费av网址| 国产二区视频在线播放| 玖玖精品在线视频| 国产成年人视频网站| 日日摸日日碰夜夜爽av| 日本国产中文字幕| 福利片一区二区三区| 久久国产色av免费观看| 九色自拍视频在线观看| 99热一区二区三区| 久热精品在线观看视频| 黄色片视频在线播放| 妞干网在线观看视频| 99国产精品白浆在线观看免费| 天堂视频免费看| av污在线观看| 黄色av免费在线播放| 精品中文字幕av| 国产精品久久久久7777| 91免费版看片| 免费极品av一视觉盛宴| 免费观看黄色大片| a级网站在线观看| 色综合五月婷婷| 亚洲热在线视频| 日本精品免费视频| 日本中文字幕影院| 手机在线视频一区| 99热一区二区三区| 日本天堂免费a| 丁香花在线影院观看在线播放| 久久99久久99精品| 国产精品无码人妻一区二区在线| 日本a视频在线观看| 大陆极品少妇内射aaaaa| heyzo国产| 在线观看的毛片| 福利网在线观看| 黄色一级片在线看| 久草青青在线观看| 亚洲欧美在线精品| 桥本有菜av在线| 3d动漫一区二区三区| 无码人妻h动漫| 一区二区三区视频网| 国产精品无码乱伦| 久久成人免费观看| 一级片视频免费观看| 最新av在线免费观看| 欧美a v在线播放| 日本 片 成人 在线| 黄色一级大片免费| 欧美精品成人网| 青青草免费在线视频观看| 日韩欧美一区三区| 黄色a级三级三级三级| av高清在线免费观看| 亚洲美女爱爱视频| 久久国产成人精品国产成人亚洲| 色噜噜狠狠永久免费| 97超碰人人澡| 亚洲视频一二三四| 国产va亚洲va在线va| 亚洲激情在线看| 欧美一级欧美一级| www.污网站| 亚洲高清在线免费观看| 男人日女人的bb| xx欧美撒尿嘘撒尿xx| 丝袜人妻一区二区三区| 精品国产鲁一鲁一区二区三区| 亚洲午夜无码av毛片久久| eeuss中文| 亚洲a级黄色片| 国产一级做a爰片久久| 国产精品无码人妻一区二区在线| 中文字幕在线视频一区二区| 熟女少妇精品一区二区| 国产一区二区在线视频播放| 麻豆一区二区三区在线观看| av噜噜在线观看| 男生操女生视频在线观看 | 午夜宅男在线视频| aa在线观看视频| www插插插无码视频网站|