📜  SFML图形库|快速教程

📅  最后修改于: 2021-05-20 07:40:28             🧑  作者: Mango

因此,在这个非常快速的教程中,让我们学习强大的OpenGL驱动的SFML图形库的基础知识。

什么是SFML?

简而言之,SFML是用于C++的多媒体库,具有可用于其他语言(如Python,Rust等)的绑定。它不仅使您可以将硬件加速的2D图形与OpenGL一起使用,而且还具有与不同类型的媒体相关的多种方法例如字体,音频等。它代表简单和快速多媒体库。好吧,这有多简单?非常简单,您可以在不到15分钟的时间内运行蛇游戏。
有多快?
它是如此之快,以至于您将以每秒几千帧的速度运行该应用程序。

SFML在哪里使用?

SFML被大量用于制作游戏甚至游戏引擎。即使SFML不支持3D渲染,它仍可用于上下文创建。由于OpenGL无法创建窗口,因此3D图形程序员(至少大部分时间)使用SFML来完成任务。

搭建环境

在使用SFML编程之前,我们必须设置环境!希望这不是件令人头疼的事情,尤其是如果您使用的是Linux! Debian Linux用户(以及任何其他带有apt / apt-get的Linux版本)可以使用以下命令安装SFML:

sudo apt-get install libsfml-dev

Windows用户可以从此链接下载SFML,然后按照指南进行安装。

SFML入门

这是您将找到的最基本的SFML应用程序:

#include 
int main()
{
    sf::Window window(
        sf::VideoMode(640, 480),
        "Hello World");
    return 0;
}

现在开始编译程序-由于SFML是动态链接的库,因此需要将程序链接到该库。此步骤取决于所使用的SFML组件。由于我们正在使用Graphics.hpp,所以我们说:-

假设您使用main.cpp作为源文件名!如果有人使用Visual Studio,则步骤将有所不同。您可以在这里参考以了解如何使用Visual Studio编译SFML项目。

现在,一旦您运行该程序,您可能会注意到该窗口已创建,但会自动消失。这是因为我们的驱动程序函数main创建了一个窗口,一旦创建了窗口,便移至第二条return 0;语句return 0;因此退出程序!因此,我们需要一个基本的循环,只要用户不关闭窗口,该循环便会继续运行。

因此,让我们重构代码,这次逐行了解实际发生的情况:

#include 
int main()
{
    sf::Window window(
        sf::VideoMode(640, 480),
        "Hello World");
    while (window.isOpen()) {
        sf::Event event;
        while (window.pollEvent(event))
            if (event.type == 
            sf::Event::Closed)
                window.close();
    }
    return 0;
}

在运行程序之前,让我们了解发生了什么!
解释

  1. 第一条语句使用Window构造函数创建一个window对象。在此,我们传递窗口的视频模式和标题。顺便说一句,VideoMode只是一种类型,它定义了窗口的尺寸(以及每个像素的位数,但我们现在不需要了)。还要注意,我们正在使用’sf’名称空间,因为所有SFML类和方法都在该类下定义。
  2. 在第二个语句中,我们有一些新逻辑。只要窗口打开,我们基本上就在运行一个循环。事实证明Window类提供了isOpen方法,该方法返回是否打开窗口。现在,在此循环中,我们检查事件。我们创建一个事件对象,然后将其传递给window.pollEventpollEvent方法的基本作用是检查事件队列是否不为空。它用队列中的下一个事件更新事件,然后在事件循环中,我们检查事件是否不是sf::Event::Closed ,这只是询问SFML的一种神秘方式,用户X..ed了窗口吗?默认情况下,当用户单击关闭按钮时,没有任何反应,因此我们通过关闭窗口来覆盖此行为。

请注意,关闭窗口不会终止程序!但是由于我们的窗口现在已关闭,因此isOpen方法现在将返回false,而我们将退出所谓的程序主循环

现在,如果您运行该程序,您将看到一个看起来很奇怪的窗口(如下所示)。

当然可以关闭它,但看起来很奇怪,屏幕上的先前内容已映射到它,看起来很奇怪。发生这种情况是因为我们没有清除窗口!

在下一个示例中,我们将要做(清除窗口)并在屏幕上绘制形状?听起来很有趣!让我们开始吧-

使用SFML渲染简单形状

SFML不仅涉及窗口创建(即使许多人仅将其用于此)。它可用于渲染硬件加速的图形(包括一些基本形状和复杂形状)。在此示例中,我们将约束自己绘制基本形状(圆形):-

#include 
int main()
{
    sf::RenderWindow window(
        sf::VideoMode(640, 480),
        "Hello World");
    sf::CircleShape shape(200);
  
    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;
}

这将产生以下输出:-

解释:

  1. 注意:已使用RenderWindow代替Window。
    尤其是因为我们正在窗口中渲染某些东西。 Window类实际上是为OpenGL程序员或仅想创建和绘制窗口的任何人准备的!如果必须在窗口上渲染某些内容,则必须使用RenderWindow类。两者之间的根本区别在于,一个是为创建上下文创建空白窗口而设计的,另一个是专门为2D渲染而设计的,您不能在SFML之外使用它。
  2. 从RenderWindow继续,在第06行中,我们创建了一个圆形并以100作为半径传递。现在,在事件循环之后,我们就清除了窗口的内容。这一点很重要,否则在上一帧(先前的迭代)中绘制的圆仍将存在,并且如果我们有一个移动的圆,它将产生大量圆的效果!因此,我们清除屏幕以擦除在上一帧中绘制的内容,然后在新的新屏幕中绘制圆形!请注意,由于我们未设置圆的位置,因此默认设置为(0,0)。绘制形状后,我们必须显示窗口的内容。之所以如此重要,是因为形状不是首先在窗口上绘制,而是在空白的空白画布上绘制,而SFML在此空白画布上绘制时,它会显示上一次迭代的内容。并且在画布上绘制过程完成后,它将使用新创建的画布翻转Windows内容。如果您好奇的话,整个过程称为双重缓冲

SFML的优点

SFML相对于其他多媒体库的优势是:

  1. SFML是免费且开源的(与DirectX(封闭源的DirectX或专有的Metal)不同)
  2. SFML是跨平台的,可以在Windows,Linux / Unix,Mac上运行,并且正在进行实验,使其可以在Android和iOS上移植(与其他图形库(如Windows API等)相比,仅支持一个平台)
  3. SFML超快速与某些甚至无法达到500fps的图形API相比,您的应用程序大多数时候将以每秒几千帧的速度运行!
  4. SFML是多语言的。在本文中,我们使用了C++,但是您可以使用Python甚至GoLang来创建相同的东西!也就是说,SFML为几种主流语言提供了正式的绑定。大多数图形API几乎不提供一种以上的语言绑定,而SFML提供了超过12种不同的编程语言的绑定!

SFML的缺点

SFML还存在一些缺点:

  1. SFML无法执行3D ! SFML严格用于提供低级硬件加速的2D图形渲染。对于3D,您可能必须将其与OpenGL结合使用
  2. 没有对Android和iOS的坚定支持!尽管正在进行实验,但目前还没有针对Android,iOS或其他移动平台的坚定支持

进一步阅读

现在,我将结束本文。希望你学到东西或学习。以下是一些书,您可以阅读以了解更多关于SFML的信息

  • SFML蓝图
  • 掌握SFML游戏开发

    当然,原始的sfml Wiki很吸引人,您也可以在此参考。此外,论坛中的人员也非常乐于助人,如果您有任何疑问,将很乐意为您提供帮助。祝您学习SFML的过程中一切顺利。

    您还可以在本文中阅读有关动态库的更多信息(它们在哪些方面与静态库有所不同)

    参考

    https://www.sfml-dev.org/tutorials/2.0/start-linux。的PHP
    https://www.sfml-dev.org/tutorials/2.0/window-window。的PHP
    https://www.sfml-dev.org/tutorials/2.0/graphics-shape。的PHP