免责声明
本文基于本人对于游戏引擎的一些拙劣的观察与实践,具有不专业性,请不要将其当做真理或圣经。
关于SFML
SFML (Simple and Fast Multimedia Library) 是一个十分方便的多媒体库,里面把很多我们需要的 API 进行了初步的包装与实现,如图像、网络、音频等,而且是一个跨平台库,比较适合我们用来演示。
我们写窗口管理系统就可以用到 SFML 的窗口模块。
制作一个窗口类
由于 SFML 的窗口模块以及把大部分的窗口管理功能实现了,所以我们只需要在 SFML 的 sf::RenderWindow
类基础上进行一次派生,然后实现一些修改功能即可。
如果有些 SFML 的原函数你不懂 (其实大部分可以考名字猜出作用),你可以参考他们的 官方教程,里面还有他们的 API 文档。
class MyWindow: public sf::RenderWindow {
public:
// 默认构造函数
MyWindow(): sf::RenderWindow() {}
// 对原构造函数进行了简便化
MyWindow(
uint32_t width, uint32_t height,
const char* title,
uint32_t style = sf::Style::Default):
sf::RenderWindow(sf::VideoMode(width, height), title, style) {}
// 对原窗口新建函数进行简便化
void create(
uint32_t width, uint32_t height,
const char* title,
uint32_t style = sf::Style::Default) {
sf::RenderWindow::create(sf::VideoMode(width, height), title);
}
// 对窗口位置设置函数进行简便化
void setPosition(int32_t x, int32_t y) {
sf::RenderWindow::setPosition({x, y});
}
// 对窗口尺寸设置函数进行简便化
void setSize(uint32_t width, uint32_t height) {
sf::RenderWindow::setSize({width, height});
}
// 对窗口图标设置函数进行简便化
void setIcon(const char* file) {
sf::Image _img;
_img.loadFromFile(file);
sf::RenderWindow::setIcon(
_img.getSize().x, _img.getSize().y,
_img.getPixelsPtr());
}
};
为了简便起见 (其实也已经是最简便的版本了) 我们只是挑出了原 sf::RenderWindow
中比较复杂的成员函数进行包装,但是我们已经可以利用这个类来创建一个窗口了。
然后我们调用主程序,就可以看见一个 GUI 窗口了。
int main() {
MyWindow win(800, 600, "MyWindow");
system("pause");
return 0;
}
其实单个模块的实现并不是什么太大的问题,主要是各个模块之间如何互相联系。