sfml-tutorials 官方教程的嘟嘟翻译 windows篇
系列文章
SFML-windows 篇
SFML-Events explained 篇
SFML-Keyboard, mouse and joystick 篇
SFML-Using OpenGL in a SFML window 篇
SFML-Drawing 2D stuff 篇
SFML-Shapes 篇
SFML-Sprites and textures 篇
文章目录
- 系列文章
- 打开一个windows
- 执行windows
- 绘制windows
- 控制帧速率
- windows的相关知识
- 您可以创建多个窗口
- 尚未正确支持多个监视器
- 必须在窗口线程中轮询事件
- 在macOS上,必须在主线程中管理窗口和事件
- 在Windows上,大于桌面的窗口将无法正常运行
打开一个windows
SFML中的窗口由sf::Window类定义。可直接创建和打开窗口:
int main()
{sf::Window window(sf::VideoMode(800, 600), "My window");return 0;
}
第一个参数“视频模式”定义窗口的大小(内部大小,不带标题栏和边框)。这里,我们创建一个大小为800x600像素的窗口。
VideoMode类有一些有趣的静态函数来获取桌面分辨率,或者全屏模式的有效视频模式列表。
第二个参数只是窗口的标题。
此构造函数接受第三个可选参数:样式,它允许您选择所需的装饰和功能。可以使用以下样式的任意组合:
还有第四个可选参数,用于定义特定于OpenGL的选项,这些选项在专门的OpenGL教程中进行了解释。
如果要在构建sf::window实例后创建窗口,或者使用不同的视频模式或标题重新创建窗口,可以改用create函数。它采用与构造函数完全相同的参数。
#include <SFML/Window.hpp>int main()
{sf::Window window;window.create(sf::VideoMode(800, 600), "My window");return 0;
}
执行windows
如果您尝试执行上面的代码,但没有任何内容代替“…”,你几乎看不到什么。首先,因为程序立即结束。其次,因为没有事件处理——所以即使您向代码中添加了一个无止境的循环,您也会看到一个死窗口,无法移动、调整大小或关闭。
让我们添加一些代码,使该程序更有趣:
#include <SFML/Window.hpp>int main()
{sf::Window window(sf::VideoMode(800, 600), "My window");// run the program as long as the window is openwhile (window.isOpen()){// check all the window's events that were triggered since the last iteration of the loopsf::Event event;while (window.pollEvent(event)){// "close requested" event: we close the windowif (event.type == sf::Event::Closed)window.close();}}return 0;
}
上述代码将打开一个窗口,并在用户关闭它时终止。让我们详细看看它是如何工作的。
首先,我们添加了一个循环,确保在关闭窗口之前刷新/更新应用程序。大多数(如果不是全部)SFML程序都会有这种循环,有时称为主循环或游戏循环。
然后,我们想在游戏循环中做的第一件事就是检查发生的任何事件。请注意,我们使用while循环,以便在存在多个挂起事件的情况下处理所有挂起事件。如果事件处于挂起状态,则pollEvent函数返回true;如果没有事件,则返回false。
每当我们得到一个事件,我们必须检查它的类型(窗口关闭?按键?鼠标移动?操纵杆连接?…),如果我们对它感兴趣,就做出相应的反应。在这种情况下,我们只关心Event::Closed事件,它是在用户想要关闭窗口时触发的。此时,窗口仍处于打开状态,我们必须使用close函数显式关闭它。这使您能够在关闭窗口之前执行某些操作,例如保存应用程序的当前状态或显示消息。
关闭窗口后,主循环退出,程序终止。
此时,您可能已经注意到,我们还没有讨论过在窗口中绘制一些东西。正如简介中所述,这不是sfml窗口模块的工作,如果要绘制精灵、文本或形状等内容,则必须跳转到sfml图形教程。
要绘制东西,也可以直接使用OpenGL,完全忽略sfml图形模块。窗口在内部创建一个OpenGL上下文,并准备接受您的OpenGL调用。您可以在相应的教程中了解更多信息。
不要期望在此窗口中看到有趣的内容:您可能会看到统一的颜色(黑色或白色),或者以前使用OpenGL的应用程序的最后内容,或者。。。还有别的。
绘制windows
当然,SFML允许您稍微使用windows。支持更改大小、位置、标题或图标等基本窗口操作,但与专用GUI库(Qt、wxWidgets)不同,SFML不提供高级功能。SFML窗口仅用于为OpenGL或SFML绘图提供环境。
您可以参考API文档以获得sf::Window函数的完整列表。
如果您确实需要窗口的高级功能,您可以使用另一个库创建一个(甚至是一个完整的GUI),并将SFML嵌入其中。为此,您可以使用sf::Window的另一个构造函数或创建函数,该函数接受现有窗口的特定于操作系统的句柄。在这种情况下,SFML将在给定窗口内创建图形上下文,并捕获其所有事件,而不会干扰父窗口管理。
sf::WindowHandle handle = /* specific to what you're doing and the library you're using */;
sf::Window window(handle);
如果您只需要一个额外的、非常特定的特性,也可以反过来做:创建一个SFML窗口,并获得其特定于操作系统的句柄来实现SFML本身不支持的功能。
sf::Window window(sf::VideoMode(800, 600), "SFML window");
sf::WindowHandle handle = window.getSystemHandle();// you can now use the handle with OS specific functions
将SFML与其他库集成需要一些工作,这里将不进行描述,但您可以参考专门的教程、示例或论坛帖子。
控制帧速率
有时,当应用程序运行速度很快时,您可能会注意到诸如撕裂之类的视觉瑕疵。原因是应用程序的刷新率与监视器的垂直频率不同步,因此,前一帧的底部与下一帧的顶部混合。
此问题的解决方案是激活垂直同步。它由图形卡自动处理,可以通过setVerticalSyncEnabled功能轻松打开和关闭:
window.setVerticalSyncEnabled(true); // call it once, after creating the window
此调用后,应用程序将以与监视器刷新率相同的频率运行。
有时,setVerticalSyncEnabled不会产生任何效果:这很可能是因为在图形驱动程序的设置中,垂直同步被强制“关闭”。应将其设置为“由应用程序控制”。
在其他情况下,您可能还希望应用程序以给定的帧速率而不是监视器的频率运行。这可以通过调用setFramerateLimit来完成:
window.setFramerateLimit(60); // call it once, after creating the window
与setVerticalSyncEnabled不同,此功能由SFML本身实现,使用sf::Clock和sf::sleep的组合。一个重要的结果是,它不是百分之百可靠的,特别是对于高帧率:sf::sleep的分辨率取决于底层操作系统和硬件,可以高达10或15毫秒。不要依赖此功能来实现精确计时。
windows的相关知识
下面是一个简短的列表,列出了使用SFML windows可以做什么和不能做什么。
您可以创建多个窗口
SFML允许您创建多个窗口,并可以在主线程中处理所有窗口,或者在自己的线程中处理每个窗口(但是…请参见下文)。在这种情况下,不要忘记为每个窗口都有一个事件循环。
尚未正确支持多个监视器
SFML不显式管理多个监视器。因此,您将无法选择窗口显示在哪个监视器上,也无法创建多个全屏窗口。这应该在将来的版本中得到改进。
必须在窗口线程中轮询事件
这是大多数操作系统的一个重要限制:事件循环(更准确地说,是pollEvent或waitEvent函数)必须在创建窗口的同一线程中调用。这意味着,如果要创建一个用于事件处理的专用线程,则必须确保该窗口也在该线程中创建。如果您真的想在线程之间分割事物,那么将事件处理保留在主线程中并移动其余的(渲染、物理、逻辑等)会更方便改为单独的线程。此配置还将与下面描述的其他限制兼容。
在macOS上,必须在主线程中管理窗口和事件
是的,这是真的;如果您试图在主线程以外的线程中创建窗口或处理事件,macOS不会同意。
在Windows上,大于桌面的窗口将无法正常运行
出于某种原因,Windows不喜欢比桌面大的窗口。这包括使用VideoMode::getDesktopMode()创建的窗口:添加了窗口装饰(边框和标题栏),最终得到的窗口略大于桌面。
sfml-tutorials 官方教程的嘟嘟翻译 windows篇相关推荐
- Cocos2d-x 的3D游戏制作官方教程(中文翻译)
Cocos2d-x 在版本3开始已经支持了3D游戏开发的特性,我在官网文档看到3D开发的部分,觉得有必要记录一下,权当做学习笔记.因为只花了半天时间翻译,而且能力有限,各位看官勿喷. 本博客虽然水分很 ...
- Catlike Coding Unity教程系列 中文翻译 Basics篇(五)Compute Shaders
计算着色器 渲染一百万个立方体 原文地址:https://catlikecoding.com/unity/tutorials/basics/compute-shaders/ 在计算缓冲区中存储位置. ...
- Catlike Coding Unity教程系列 中文翻译 Basics篇(一)Game Objects and Scripts
游戏对象和脚本 原文地址:https://catlikecoding.com/unity/tutorials/basics/game-objects-and-scripts/ 本次教程的主要内容: 用 ...
- Catlike Coding Unity教程系列 中文翻译 Basics篇(二)Building a Graph
建立一个函数图像 可视化的数学 原文地址:https://catlikecoding.com/unity/tutorials/basics/building-a-graph/ 本次教程的主要内容: 创 ...
- 《SteamVR2.2.0官方教程(二)》(Yanlz+Unity+XR+VR+AR+MR+SteamVR+Valve+Tutorials+Interaction+Oculus+立钻哥哥++ok++)
<SteamVR2.2.0官方教程> <SteamVR2.2.0官方教程> 版本 作者 参与者 完成日期 备注 SteamVR2.2.0_Tutorials_V01_1.0 严 ...
- 《SteamVR2.2.0官方教程(一)》(Yanlz+Unity+XR+VR+AR+MR+SteamVR+Valve+Oculus+Tutorials+Interaction+立钻哥哥++ok++)
<SteamVR2.2.0官方教程> <SteamVR2.2.0官方教程> 版本 作者 参与者 完成日期 备注 SteamVR2.2.0_Tutorials_V01_1.0 严 ...
- Java官方教程目录2021最新版
前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子:翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着 ...
- Java官方教程(三-2)赋值 运算和一元运算符(2020.12.19)
前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子:翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着 ...
- Java官方教程(三-1)运算符 operator(2020.12.18)
前言 本文是橙子出于兴趣爱好对Java官方教程的尝试翻译,几乎每日更新,感兴趣的朋友可以关注一下橙子:翻译过程中尽可能多的对一些关键词保留了英文原文,如果你想看最纯正的英文原版教材却又看不懂,可以试着 ...
最新文章
- Windows 10 开发日记(五)-- 当Binding遇到异步 -- 解决方案
- DIY Virtual Wall for Roomba – Part One
- Python爬虫开发:requests库的使用--https协议的问题解决
- mysqlfront连接MySQL错误_使用MySql-Front远程连接MySQL失败的解决办法
- apache在线升级yum_基于Redis实现在线游戏积分排行榜 - phyger
- kafka逻辑示意图以及命令
- 火鸡堂团队 团队展示
- [Android]RapidFloatingActionButton框架正式出炉
- 2021年10种最佳数据库管理软件
- jQuery 视频教程-佟刚-专题视频课程
- 劉筱娟:人工智能名片能在移动互联网营销上发挥什么作用?
- Typora编辑的markdown文档莫名其妙消失或未保存,两种恢复方式
- ⑦企业级zabbix监控 微信报警、邮箱报警、钉钉报警、全网最细
- 解决vmbox虚拟机 能上网,能ping通宿机,但是宿机 ping 不通 虚拟机
- CRLF和LF的区别
- “Windows 找不到文件...”,怎么处理?
- 刘未鹏博客精华整理55条
- 博弈论coursera
- 操作系统与嵌入式开发专家周末北京聚会
- 2022年茶艺师(初级)上岗证题库及答案