2014/10/24

SFML 遊戲程式設計 (二) 聲音播放

在上一章安裝及測試完SFML的環境,並說明了遊戲迴圈及繪圖之後,
接著就要介紹一個SFML異於其他遊戲設計API,可以說是幾乎非常無腦好用的功能,
聲音播放!

記得要額外複製.dll到system32跟SysWOW64裡,各為libsndfile-1.dll與openal32.dll。
可以在SFML-master\extlibs\bin裡面找到。

首先貼出範例程式碼:
//***************************************************
//**使用SFML播放音樂範例 using C++
//**by 望月誠@noeleon930.blogspot.tw
//**此範例檔案可以自由更改、引述或轉貼,但記得要註明來源喔
//***************************************************

#include <iostream>

//從source裡的include資料夾可以找到,請複製到適當的地方或者直接套用
#include <SFML\Audio.hpp>

//宣告Music物件,這裡命名為music
sf::Music music;

//宣告音量變數,並初始成50
float volume = 50;

int main()
{
    music.openFromFile("music.ogg");  //從檔案開啟,與程式或專案程式的同目錄下,叫做music.ogg的檔案
    music.setVolume(volume);  //將音量設定為volume,一開始為50
    music.setLoop(true);  //使music的音樂可以重複播放,反之可設為false
    music.play();  //開始播放music

    //記得別把.play()放在一個可能會重複執行到的地方,否則音樂播放會卡住
    //假如還是要得放的話,記得設條件避開.play()

    while (music.getStatus() != music.Stopped)  //取得music的狀態,當music還沒停止播放的時候,就讓迴圈繼續執行
    {
        std::cout << "Current volume is " << music.getVolume() << ".\nSet volume (max:100) or input -1 to exit, -2 to pause music, -3 to resume music. /> ";  //顯示music目前的音量並顯示操作方式
        std::cin >> volume;

        if (volume == -1) music.stop();  //假如使用者輸入了-1,停止播放music
        if (volume == -2) music.pause();  //假如使用者輸入了-2,暫停播放music
        if (volume == -3 && music.getStatus() == music.Paused) music.play();  //假如使用者輸入了-3且目前是暫停狀態的話,恢復播放music 

        music.setVolume(volume);  //將music的音量設成使用者輸入的值
    }

    return 0;
}

SFML的音樂播放是非同步的,也就是說播放開始之後,系統就會繼續執行下一行程式碼,而不會等到音樂播完才會執行下一行程式碼。

亦可以同時很多聲音播放,但根據官網的說法,假如同時播放120個以上的聲音的時候,可能會造成系統錯誤,所以播完的Music物件記得要回收。

關於要怎麼將聲音檔案轉成ogg,可以使用MeGUI或者MediaCoder唷。

沒有留言:

張貼留言