C/C++ SFML 基本範例教學

本篇 ShengYu 介紹 C/C++ SFML 基本範例教學,SFML (Simple and Fase Media Library) 是由 C++ 寫成的跨平台遊戲、多媒體函式庫,可支援多種程式語言,SFML 分成幾大模塊:系統、視窗、圖形、音訊與網路。

簡單介紹 SFML 以下幾個模塊:
System:一些基礎建設,例如:向量(vector)、字串、thread、timer
Window:管理視窗以及輸入(鍵盤、滑鼠、搖桿等)及 OpenGL
Graphics:硬體加速的 2D 圖形,例如:sprite, text, shapes
Audio:音訊、錄音、3D音效
Network:TDP 與 UDP socket 與 HTTP 跟 FTP

C/C++ SFML 基本範例

以下介紹 C/C++ SFML 基本範例,首先先建立一個 200x200 大小的 sf::RenderWindow 物件,
再建立一個 sf::CircleShape 物件,並且用 setFillColor() 設定顏色為紅色,

接著在 SFML 主迴圈中呼叫 draw 繪製 sf::CircleShape 物件。

main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// g++ main.cpp -o a.out `pkg-config --cflags --libs sfml`
// g++ main.cpp -o a.out -I./SFML-2.5.1/include -L./SFML-2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system
#include <SFML/Graphics.hpp>

int w = 200;
int h = 200;

int main()
{
sf::RenderWindow window(sf::VideoMode(w, h), "SFML");

sf::CircleShape shape(100.f);
shape.setFillColor(sf::Color::Red);

while (window.isOpen()) {
sf::Event e;
while (window.pollEvent(e)) {
if (e.type == sf::Event::Closed)
window.close();
}

window.clear();
window.draw(shape);
window.display();
}

return 0;
}

我是從官網下載 SFML-2.5.1 解壓縮後放在當前目錄,編譯時帶入 SFML 的 include 與 lib 資料夾位置,以及連結的 SFML libary,
編譯指令如下,

1
g++ main.cpp -o a.out -I./SFML-2.5.1/include -L./SFML-2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system

執行指令如下,

1
export LD_LIBRARY_PATH=./SFML-2.5.1/lib && ./a.out

程式執行結果如下,

如果是 Visual Studio 的話則是要在專案中設定一下 SFML 的標頭檔 include 資料夾位置,
在 C/C++ » General » Additional Include Directories 加入,

以及設定一下 SFML 的函式庫 lib 資料夾位置,
在 Linker » General » Additional Library Directories 加入,

以及要連結 SFML 的 lib 名稱,
在 Linker » Input » Additional Dependencies 加入 sfml-graphics.lib,sfml-window.lib,sfml-system.lib,

更多詳細步驟可參考官網

C/C++ SFML 顯示文字

以下示範 C/C++ SFML 顯示文字,首先建立一個 sf::Font 物件,之後呼叫 loadFromFile 將字型檔讀取到記憶體。

之後建立一個 sf::Text 物件,sf::Text 物件建構 3 引數分別為,1. 要顯示的字串,2. 使用的字型,3. 畫素中的字元大小,沒有傳入的話預設值是 30。

接著在 SFML 主迴圈中呼叫 draw 繪製 sf::Text 物件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// g++ sfml-text.cpp -o a.out `pkg-config --cflags --libs sfml`
// g++ sfml-text.cpp -o a.out -I./SFML-2.5.1/include -L./SFML-2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system
#include <SFML/Graphics.hpp>

int main()
{
sf::RenderWindow window(sf::VideoMode(300, 200), "SFML");

sf::Font font;
if (!font.loadFromFile("arial.ttf"))
return EXIT_FAILURE;
sf::Text text("Hello SFML", font, 25);

while (window.isOpen()) {
sf::Event e;
while (window.pollEvent(e)) {
if (e.type == sf::Event::Closed)
window.close();
}

window.clear();
window.draw(text);
window.display();
}

return 0;
}

程式執行結果如下,

C/C++ SFML 播放音樂

以下是 SFML 播放音樂的範例,建立使用 sf::Music 物件,然後呼叫 openFromFile 開啟音訊檔,之後再呼叫 play 就開始播放音訊檔,

sfml-audio.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// g++ sfml-audio.cpp -o a.out `pkg-config --cflags --libs sfml`
// g++ sfml-audio.cpp -o a.out -I./SFML-2.5.1/include -L./SFML-2.5.1/lib -lsfml-graphics -lsfml-window -lsfml-system -lsfml-audio
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

int main()
{
sf::RenderWindow window(sf::VideoMode(300, 200), "SFML");

sf::Music music;
if (!music.openFromFile("audio.ogg"))
return EXIT_FAILURE;
music.play();

while (window.isOpen()) {
sf::Event e;
while (window.pollEvent(e)) {
if (e.type == sf::Event::Closed)
window.close();
}

window.clear();
window.display();
}

return 0;
}

找不到檔案會顯示這樣的訊息,

1
Failed to open sound file "audio.ogg" (couldn't open stream)

播放的音訊格式不支援的話會出現這樣的訊息,

1
Failed to open sound file "audio.mp3" (format not supported)

有找到檔案且支援該音訊格式的話就會播放。

以上就是 C/C++ SFML 基本範例教學,
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!

下一篇將介紹怎麼用 C/C++ SFML 來製作 snake 貪食蛇遊戲

其它參考
SFML and Linux (SFML / Learn / 2.5 Tutorials)
https://www.sfml-dev.org/tutorials/2.5/start-linux.php

其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ snake 貪食蛇遊戲範例