配置过程参考下面的文章:
教程
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编写贪吃蛇游戏,一步一步把这个程序变成好玩的游戏。