SFML官方地址:下载地址
PS:需要梯子
将SFML的开发包从官网下载到电脑上,不同的系统下载不同的版本,别搞错了,具体怎么下载,不做多余叙述。
笔者这里使用的是GCC+VSCode+Windows,如果你需要使用IDE,请到官网上查询怎么在IDE上配置。SFML的开发包下载到电脑之后,需要将开发包中的文件拷贝到GCC的目录下,例如include目录,bin目录,lib目录,对应拷贝即可。开发包的include最好改个名字在整个目录拷贝到GCC的include目录下,笔者这里改成SFML。
示例代码
配置完成之后,总得来段代码试试效果,查看是否配置成功,以下就用一段小小的代码来测试。
要使用别人的库,想都不用想,肯定是要先引入了。
#include <iostream>
#include <SFML/Graphics> // 改目录名只是为了方便管理
SFML的所有功能都写在了sf命名空间下,笔者比较懒,不想通过sf::xx的方式去使用,所以直接引入using namespace来引入sf。
using namespace std;
using namespace sf;
接下来就是创建一个窗口来显示效果了,这里我们创建一个200*200像素的窗口,窗口标题为SFML Hello World
RenderWindow win(VideoMode(200, 200), "SFML Hello World");
光有一个干干净净的窗口那有什么意思,想起了被黑框框支配的工具了吗,所以窗口需要显示些什么,让窗口显示一个圆吧。在SFML里有这个一个类叫CircleShape,英文不是特别差的就知道这是圆形,那么我们就用这个类在生成一个圆形吧,并且设置为绿色?不,还是红色吧。
// 这里需要传圆的半径,笔者这里设置的为100
CircleSape shape(100.0f);
// 圆形是有了,但是还没有颜色,该设置颜色了
// SFML中内置了一些颜色,通过Color去使用,例如Color::Red
shape.setFillColor(Color::Red);
窗口和圆都有了,接着就需要把圆画到窗口上了,RenderWindoow中提供了一个方法draw,可以将shape绘制到窗口上。
// 清除窗口内容
win.clear();
// 绘制shape
win.draw(shape);
// 刷新显示
win.display();
到这里是不是想看看自己的成果,让我们试着编译运行看看,将文件保存为main.cpp,通过命令行调用GCC编译,命令如下:
/**
这里采用动态链接的方式进行链接
sfml-graphics、sfml-window、sfml-systen均为sfml的所需要的链接库
*/
g++ -o main mian.cpp -lsfml-graphics -lsfml-window -lsfml-system
编译完成之后,嗯,多了个exe执行文件,双击打开,发现报错,这是因为我们编译时使用的是动态连接,所以程序运行时需要提供相应的dll文件,linux对应的是so文件。开发包中含有sfml程序所需要的dll文件,我们将其拷贝到与exe文件同一目录下。再次双击,能运行了,但是并没有什么效果。还是有效果的,有画面从屏幕上一闪而过。这是因为我们的代码都是从上至下顺序执行的,而且计算机的执行速度也是非常快的,所以我们看不到什么明显的效果。在我们学习C++的过程中,我们知道用循环可以来保持程序一直执行,那么我们通过while让程序一直运行吧。(不要用死循环,程序的设计要保证程序的有穷性)
#include <iostream>
#include <SFML/Graphics>
using namespace std;
using namespace sf;
int main(int argc, char ** args) {
RenderWindow win(VideoMode(200, 200), "SFML Hello World");
CircleSape shape(100.0f);
shape.setFillColor(Color::Red);
while(window.isOpen()) {
win.clear();
win.draw(shape);
win.display();
}
return 0;
}
再次编译运行,发现窗口能一直显示了,但是关不掉,只能通过任务管理器结束该程序。这是因为还差了一个步骤:事件监听。我们需要对窗口上的关闭按钮进行监听,当按钮按下,触发窗口关闭。
完整的代码
#include <iostream>
#include <SFML/Graphics>
using namespace std;
using namespace sf;
int main(int argc, char ** args) {
RenderWindow win(VideoMode(200, 200), "SFML Hello World");
CircleSape shape(100.0f);
shape.setFillColor(Color::Red);
while(window.isOpen()) {
Event event;
while(window.pollEvent(event)) {
if (event.type == Event::Closed) {
window.close();
}
}
win.clear();
win.draw(shape);
win.display();
}
return 0;
}
再次编译运行,窗口正常显示,也可以关闭了。本篇到此结束,如果还有下一篇,那可能是我闲的没事了吧。