C++ sfml使用教程

配置过程参考下面的文章:

超详细!SFML库vs2022配置教程-CSDN博客

教程

sfml是一个图形库,它提供了窗口,绘图等图形化功能。

先来看一个简单的例子(官方demo)

例子

#include <SFML/Graphics.hpp>
 
int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
 
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
        window.clear();
        window.draw(shape);
        window.display();
    }
 
    return 0;
}

解析

窗口

#include <SFML/Graphics.hpp>

sfml的主要功能的体现在SFML/Graphics.hpp的里面,所以我们使用sfml的时候需要导入这个文件。

int main()
{
    sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!");
    sf::CircleShape shape(100.f);
    ...
}

RenderWindow是sfml提供的一个窗口类,他有三个参数。

第一个参数:窗口的大小。不需要多讲,VideoMode直接调用即可。

第二个参数:窗口的名称。这里有个地方需要提醒一下,中文要用宽字符串(L"我是标题")。

第三个参数:模式。

模式效果
sf::Style::None
sf::Style::Titlebar有标题栏
sf::Style::Resize窗口可以拉伸
sf::Style::Close有关闭按钮
sf::Style::Fullscreen全屏
sf::Style::Default默认(有标题栏、窗口拉伸和关闭按钮)

如果我要一个全屏的窗口,可以这样写。

sf::RenderWindow window(sf::VideoMode(200, 200), "SFML works!", sf::Style::Fullscreen);

如果要多个呢?(两个及以上模式)

在后面的参数里可以这样写:模式1 | 模式2 | 模式3 | ……

那工作原理是什么呢(不想看的直接跳转到“循环”目录)

在sfml的源文件中,有这样的一段代码。

enum
    {
        None       = 0,      //!< No border / title bar (this flag and all others are mutually exclusive)
        Titlebar   = 1 << 0, //!< Title bar + fixed border
        Resize     = 1 << 1, //!< Title bar + resizable border + maximize button
        Close      = 1 << 2, //!< Title bar + close button
        Fullscreen = 1 << 3, //!< Fullscreen mode (this flag and all others are mutually exclusive)

        Default = Titlebar | Resize | Close //!< Default window style
    };

 看懂了没有?

用来连接的  |  其实是位运算的 “或”,如果用以上二进制码就可以把每一种组合的情况都表示出来,SFML的创造者真聪明!

由于没有重复的二进制位,所以也可以用 + 号连接。

模式1 + 模式2 + 模式3 + ……

循环

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
 
        window.clear();
        window.draw(shape);
        window.display();
    }
 
    return 0;

函数作用

函数作用
isOpen返回一个布尔值,表示窗口有没有开启
pollEvent返回一个布尔值,检测有没有事件,如果有,就把事件赋值给变量
close把isOpen的返回值设为flase(关闭窗口)
clear清空所有绘制的内容
draw绘制一个对象
display窗口刷新,把绘制的东西显示出来

现在就好理解了。

做一个窗口循环,如果窗口是打开的就持续循环。

定义一个事件类型,并用pollEvent来获取事件。

如果窗口点击了关闭按钮,就关闭窗口。

然后就是绘制圆形。

总结

这个程序是一个最基本的程序,各种游戏都是从最简单的程序编写而来的。

下次,我教大家用sfml编写贪吃蛇游戏,一步一步把这个程序变成好玩的游戏。

### 使用 SFML 创建图像画廊 为了实现一个简单的图像画廊应用,可以利用 `SFML` 提供的功能来加载并显示多个图片文件。下面是一个基本的例子展示如何通过循环切换不同纹理的方式来模拟浏览多张图片的效果。 #### 初始化窗口与设置 首先,在程序启动时初始化图形渲染窗口,并设定好窗口大小以及标题栏文字: ```cpp #include <SFML/Graphics.hpp> int main() { // Create the main window with dimensions 800x600 pixels. sf::RenderWindow window(sf::VideoMode(800, 600), "Image Gallery"); } ``` #### 加载纹理资源 接着定义一个函数用于读取指定路径下的所有支持格式(*.png, *.jpg*) 的图像文件作为纹理对象存储在一个列表里以便后续访问: ```cpp std::vector<sf::Texture> loadTextures(const std::string& folderPath) { std::vector<sf::Texture> textures; DIR* dir = opendir(folderPath.c_str()); struct dirent *ent; while ((ent = readdir(dir)) != NULL) { std::string fileName(ent->d_name); if (fileName.ends_with(".png") || fileName.ends_with(".jpg")) { sf::Texture texture; if (!texture.loadFromFile(folderPath + "/" + fileName)) continue; // Skip invalid files textures.push_back(texture); } } closedir(dir); return textures; } ``` 注意这里假设操作系统提供了 POSIX 文件系统接口(`opendir`, `readdir`);对于 Windows 用户可能需要调整这部分代码以适应平台特性[^1]。 #### 显示逻辑处理 最后编写事件监听器和帧更新机制完成交互控制——当按下左右方向键时改变当前索引从而更换正在查看的图片;同时确保每次只有一张可见: ```cpp // Load all images from "./images/" directory into vector of Textures auto galleryImages = loadTextures("./images"); size_t currentIndex = 0; if(!galleryImages.empty()) { sf::Sprite sprite(galleryImages[currentIndex]); while (window.isOpen()) { sf::Event event{}; while (window.pollEvent(event)) { switch(event.type){ case sf::Event::Closed: window.close(); break; case sf::Event::KeyPressed: if(event.key.code == sf::Keyboard::Left && currentIndex > 0) --currentIndex; else if(event.key.code == sf::Keyboard::Right && currentIndex < galleryImages.size()-1) ++currentIndex; sprite.setTexture(galleryImages[currentIndex], true); break; } } // Clear screen before drawing new frame window.clear(); // Draw current image to center it onscreen float offsetX = (window.getSize().x - sprite.getGlobalBounds().width ) / 2.f; float offsetY = (window.getSize().y - sprite.getGlobalBounds().height) / 2.f; sprite.setPosition(offsetX, offsetY); window.draw(sprite); // Display everything that was drawn since last clear call window.display(); } } else { std::cerr << "No valid images found!" << std::endl; } return EXIT_SUCCESS; ``` 这段代码实现了最基本的图像画廊功能,可以根据实际需求进一步扩展其特性和界面美观度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值