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