接著就要介紹一個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唷。
沒有留言:
張貼留言