游戏引擎技术杂谈 #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;
}

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

标签: 技术, 游戏引擎, SFML

文档最后编辑于05月14日

评论

让我也说点啥