在 SFML 要建立一個視窗,要使用 sf::RenderWindow
並指定解析度(Resolution)、標題(Title)便可以建立視窗,開始處理事件(Event)循環,以及畫東西在螢幕上。
1 | sf::RenderWindow window(sf::VideoMode(1280, 720), "SFML Window"); |
sf::RenderWindow
的第三個參數可以指定視窗的 Style:
sf::Style::None
- 沒有標題欄,不能跟其他 style 混合
- 適合拿來當啟動畫面(Splash screen)
sf::Style::Titlebar
- 有標題欄
sf::Style::Resize
- 可以拉伸視窗
sf::Style::Close
- 有關閉視窗按鈕
sf::Style::Fullscreen
- 全螢幕,有限制
sf::VideoMode
- 全螢幕,有限制
sf::Style::Default
- 等於
Titlebar | Resize | Close
- 等於
事件循環
使用者跟視窗互動會引發(Trigger)視窗事件(Event),如果程式沒有處理事件的話,整個窗口就不會有反應,所以每個視窗都一定要有事件處理的邏輯。
1 |
|
窗口操作
SFML 只提供一些基本的窗口操作
1 | // 設定視窗位置 |
- 滑鼠相關
1 | // 顯示或隱藏滑鼠游標 |
- 查詢螢幕解析度
1 | sf::VideoMode v = sf::VideoMode::getDesktopMode(); |
- fps 相關
1 | // 開啟垂直同步 |
- 更改視窗成全螢幕模式
1 | window.create(sf::VideoMode(800, 600), "test", sf::Style::Fullscreen); |
這裡只列出常用的,其他比如:設定 Icon、設定滑鼠游標圖片等,請參考 Docs
SFML 支援多個建立窗口,但有一些限制:可以在不同的 thread,但獲取事件時一定要在窗口自己的 thread 上,建議的做法是用 main thread 管理窗口跟事件,然後其他例如:渲染、物理等,拿到其他 thread。
SFML 不像其他 GUI Library 提供許多窗口的功能,可以用 window.getSystemHandle()
來拿到底層的窗口 Handle,之後可以用 OS-Specific 的 function 做事
1 | sf::WindowHandle handle = window.getSystemHandle(); |
OpenGL
SFML 建立的視窗支援使用 OpenGL 混用,假如說你的程式會用到 OpenGL 的話,那要在 .cpp
中加入:
1 |
之後記得要 Link OpenGL 函式庫,否則可能會產生 Link error。
在建立視窗時可以指定 sf::ContextSettings
來設定 OpenGL 的參數。
1 | sf::ContextSettings settings; |
一個簡單的視窗建立可能會長這樣:
1 |
|
如果要混用 OpenGL 繪圖與 SFML 的繪圖 funciton 的話,則要多花心力在維護 OpenGL state 上: 在用 SFML 的繪圖 function 之前,必須先清掉 OpenGL 狀態,否則會炸裂。
1 | glDraw... |
又因為 SFML 並沒有維護 OpenGL 3.x 以上的 state ,所以當你如果有使用如 VAO, VBO, EBO 時,記得要重設狀態
1 | // 清掉 OpenGL 3.x 以上的狀態 |
參考
Using OpenGL in a SFML window
https://www.sfml-dev.org/tutorials/2.5/window-opengl.php
SFML GRAPHICS MODULE WITH OPENGL 3.3+
https://en.sfml-dev.org/forums/index.php?topic=20968.msg150056#msg150056
OPENGL WITH SFML (ASSUMED CONTEXT ISSUE)
https://en.sfml-dev.org/forums/index.php?topic=20979.0
如果你覺得這篇文章很棒,請你不吝點讚 (゚∀゚)