惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
IT之家
IT之家
C
Check Point Blog
T
The Blog of Author Tim Ferriss
S
SegmentFault 最新的问题
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
美团技术团队
M
MIT News - Artificial intelligence
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog
G
Google Developers Blog
F
Fortinet All Blogs
V
Visual Studio Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Tailwind CSS Blog
Hugging Face - Blog
Hugging Face - Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)

寒夏摸鱼站

影评《诺曼底72小时》 - 寒夏摸鱼站 Rust 的那些内置 Trait - 寒夏摸鱼站 教你造一台光棱坦克 - 寒夏摸鱼站 Vite 与 Rust 的 Monorepo 前后端联合开发 - 寒夏摸鱼站 Rust 中的全局对象实现 - 寒夏摸鱼站 Stable Diffusion 拆解分析笔记 #2 - 寒夏摸鱼站 Stable Diffusion 拆解分析笔记 #1 - 寒夏摸鱼站 加密博客测试 - 寒夏摸鱼站 FUTURE 甜点谜题 —— 出题人杂谈 Vol.1 - 寒夏摸鱼站 JS 模块系统 - 寒夏摸鱼站 教你造一台幻影坦克 - 寒夏摸鱼站 随机迷宫生成算法 - 寒夏摸鱼站 Lambda 演算 - 寒夏摸鱼站 博客搭建Log #5 - 寒夏摸鱼站 留言板 - 寒夏摸鱼站 SZTU NEW STAR CTF 游记 - 寒夏摸鱼站 使用容器化技术在 Linux 服务器上部署 OlivaDice - 寒夏摸鱼站 Rust 下的 Shell 管道调用 - 寒夏摸鱼站 柏林噪声与地形生成 - 寒夏摸鱼站 PHP 序列化的生成与解析 - 寒夏摸鱼站 猴子都能明白的 Typecho 建站教程 #4 - 寒夏摸鱼站 猴子都能明白的 Typecho 建站教程 #3 - 寒夏摸鱼站 猴子都能明白的 Typecho 建站教程 #2 - 寒夏摸鱼站 猴子都能明白的 Typecho 建站教程 #1 - 寒夏摸鱼站 博客搭建Log #4 - 寒夏摸鱼站 后缀自动机&广义后缀自动机 - 寒夏摸鱼站 字符串基础与 KMP 算法 - 寒夏摸鱼站 博客搭建Log #3 - 寒夏摸鱼站 快速傅里叶算法 - 寒夏摸鱼站 博客搭建Log #2 - 寒夏摸鱼站
游戏引擎技术杂谈 #2 - 寒夏摸鱼站
2021-05-13 · via 寒夏摸鱼站
目录
  • 关于SFML
  • 制作一个窗口类
  • 免责声明

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

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

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