寒夏摸鱼站

Live your dream, and share your passion.

游戏引擎技术杂谈 #2

免责声明

本文基于本人对于游戏引擎的一些拙劣的观察与实践,具有不专业性,请不要将其当做真理或圣经

关于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;
}

其实单个模块的实现并不是什么太大的问题,主要是各个模块之间如何互相联系。