因此,在这个非常快速的教程中,让我们学习强大的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,所以我们说:-
g++ main.cpp -lsfml-graphics -lsfml-window -lsfml-system
假设您使用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;
}
在运行程序之前,让我们了解发生了什么!
解释
- 第一条语句使用Window构造函数创建一个window对象。在此,我们传递窗口的视频模式和标题。顺便说一句,VideoMode只是一种类型,它定义了窗口的尺寸(以及每个像素的位数,但我们现在不需要了)。还要注意,我们正在使用’sf’名称空间,因为所有SFML类和方法都在该类下定义。
- 在第二个语句中,我们有一些新逻辑。只要窗口打开,我们基本上就在运行一个循环。事实证明
Window
类提供了isOpen
方法,该方法返回是否打开窗口。现在,在此循环中,我们检查事件。我们创建一个事件对象,然后将其传递给window.pollEvent
。pollEvent
方法的基本作用是检查事件队列是否不为空。它用队列中的下一个事件更新事件,然后在事件循环中,我们检查事件是否不是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;
}
这将产生以下输出:-
解释:
- 注意:已使用RenderWindow代替Window。
尤其是因为我们正在窗口中渲染某些东西。 Window类实际上是为OpenGL程序员或仅想创建和绘制窗口的任何人准备的!如果必须在窗口上渲染某些内容,则必须使用RenderWindow类。两者之间的根本区别在于,一个是为创建上下文创建空白窗口而设计的,另一个是专门为2D渲染而设计的,您不能在SFML之外使用它。 - 从RenderWindow继续,在第06行中,我们创建了一个圆形并以100作为半径传递。现在,在事件循环之后,我们就清除了窗口的内容。这一点很重要,否则在上一帧(先前的迭代)中绘制的圆仍将存在,并且如果我们有一个移动的圆,它将产生大量圆的效果!因此,我们清除屏幕以擦除在上一帧中绘制的内容,然后在新的新屏幕中绘制圆形!请注意,由于我们未设置圆的位置,因此默认设置为(0,0)。绘制形状后,我们必须显示窗口的内容。之所以如此重要,是因为形状不是首先在窗口上绘制,而是在空白的空白画布上绘制,而SFML在此空白画布上绘制时,它会显示上一次迭代的内容。并且在画布上绘制过程完成后,它将使用新创建的画布翻转Windows内容。如果您好奇的话,整个过程称为双重缓冲。
SFML的优点
SFML相对于其他多媒体库的优势是:
- SFML是免费且开源的(与DirectX(封闭源的DirectX或专有的Metal)不同)
- SFML是跨平台的,可以在Windows,Linux / Unix,Mac上运行,并且正在进行实验,使其可以在Android和iOS上移植(与其他图形库(如Windows API等)相比,仅支持一个平台)
- SFML超快速与某些甚至无法达到500fps的图形API相比,您的应用程序大多数时候将以每秒几千帧的速度运行!
- SFML是多语言的。在本文中,我们使用了C++,但是您可以使用Python甚至GoLang来创建相同的东西!也就是说,SFML为几种主流语言提供了正式的绑定。大多数图形API几乎不提供一种以上的语言绑定,而SFML提供了超过12种不同的编程语言的绑定!
SFML的缺点
SFML还存在一些缺点:
- SFML无法执行3D ! SFML严格用于提供低级硬件加速的2D图形渲染。对于3D,您可能必须将其与OpenGL结合使用
- 没有对Android和iOS的坚定支持!尽管正在进行实验,但目前还没有针对Android,iOS或其他移动平台的坚定支持
进一步阅读
现在,我将结束本文。希望你学到东西或学习。以下是一些书,您可以阅读以了解更多关于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