sfml-tutorials 官方教程 windows篇

article/2025/9/30 14:14:31

系列文章

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类有一些有趣的静态函数来获取桌面分辨率,或者全屏模式的有效视频模式列表。
第二个参数只是窗口的标题。
此构造函数接受第三个可选参数:样式,它允许您选择所需的装饰和功能。可以使用以下样式的任意组合:
hello还有第四个可选参数,用于定义特定于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()创建的窗口:添加了窗口装饰(边框和标题栏),最终得到的窗口略大于桌面。


http://chatgpt.dhexx.cn/article/BqC1OJHW.shtml

相关文章

SFML基础

原文地址&#xff1a;https://www.cnblogs.com/karl07/p/10285692.html (1) 窗口和交互 创建一个新窗口&#xff1a; sf::RenderWindow window(sf::VideoMode(500,500),"new window"); 但是光创建一个窗口并不能显示 还要加一个循环 while (window.isOpen()){sf:…

引擎开发四: SFML库及使用

SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 主要由五个模块组成&#xff0c;分别是&#xff1a;系统&#xff0c;窗口&#xff0c;图形&#xff0c;音频和网络。 SFML 是跨平台的&#xff0c;通过 SFML&…

【C++】开源:多媒体SFML库使用入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍SFML库使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

使用SFML框架打造属于自己的俄罗斯方块

目录 一、效果展示 二、游戏说明 三、开发环境 四、代码展示 五、代码详解 1.游戏区域表示 2.方块表示 3.方块旋转 4.消行处理 六、个性化定制 七、结语 一、效果展示 二、游戏说明 相信大家都玩过俄罗斯方块&#xff0c;五种按键就能带来极高的可玩性。如果想要开发…

超详细!SFML库vs2022配置教程

1.官网下载SFML 官方网址&#xff1a;SFML 点击下载 根据自己电脑选择合适的版本下载 我的电脑是64位的 下载完成之后将文件放在一个自己方便找到的地方 2.vs2022配置 选择空项目 添加cpp源文件 附加包含目录 添加你SFML中的include路径 例如&#xff1a; 添加SFML中的li…

SFML学习笔记(1)——初识SFML

一、SFML SFML 是多媒体库&#xff0c;它为PC的各个组件提供简单的界面&#xff0c;用来简化游戏和多媒体应用程序的开发。 SFML分成以下五个模块&#xff0c;这些模块相互独立&#xff0c;也可以根据需要组合在一起: System(系统)&#xff1a;一个核心模块&#xff0c;它定义…

找出数组中第k大的数

给定一个数组&#xff0c;找出数组中第k大的数。其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* author wjgs**/ public class FindK {public static void find(int[]array,int begin,int end,int k){int ipartition(array,begin,end);if(i1>k){//左半…

n个数中找最大数c语言,N个数中找到第K大的数值(C语实现)

N个数中找到第K大的数值(C语实现) N个数中找到第K大的数值(C语实现) 研究生了,选了计算机算法这门课程,这周布置了一个作业,在OJ上做:**N个数中找到第K大的数值**。大一简单学过C语言基础,目前只能用C语言编程,后续会学C++编程。 分享一份不超时的C语代码~ 测试例子: 思…

快速排序计算第K大的数

先说结论&#xff0c;最终版本代码如下&#xff1a; public class KthNum {public static int k 2;public static boolean bigK false;public static void main(String[] args) {int arr[] {3, 2, 3, 1, 7, 4, 5, 5, 6};int kNum quickSort(arr);System.out.println("…

寻找第K大的数 C语言实现的一种方法

描述 在一个数组中&#xff0c;找到第K 大的数值一个数组&#xff0c;如&#xff1a;[3,2,1,5,6,4] &#xff0c;输入 2&#xff0c;返回&#xff1a;5也就是这个K的取值&#xff0c;是从 1 开始的&#xff0c;不超过数组的最大个数 解决思路 可以使用任意的排查函数&#x…

C++——寻找第k大的数

给出一个数组&#xff0c;找出数组的第k大的数&#xff1a;基于快速排序的思路&#xff0c;每次快排后&#xff0c;基准的左边都是比其小的数&#xff0c;右边都是比其大的数&#xff0c;一次快排结束后&#xff0c;若基准所处的位置正好是第k大&#xff08;即基准右边有k-1个数…

面试题:从n个数中找出第K大的数

参考https://blog.csdn.net/orangefly0214/article/details/84997668的思路 从有n个元素的乱序数组中找出第k大的元素 方法1&#xff1a;基于冒泡排序和简单选择排序&#xff0c;时间复杂度o(n*k) 我们知道&#xff0c;在冒泡排序和简单选择排序中&#xff0c;最外层的循环每…

在N个数中查找第K大的数字(Top K问题)

在N个乱序数字中查找第k大的数字&#xff0c;时间复杂度可以减小至 O(N*logN)O(N)O(1)O(2) 答案&#xff1a;B 所谓“第&#xff08;前&#xff09;k大数问题”指的是在长度为n(n>k)的乱序数组中S找出从大到小顺序的第&#xff08;前&#xff09;k个数的问题。 注意&…

idea控制台乱码解决方法

一、问题情况&#xff1a; IntelliJ IDEA 控制台输出中文乱码部分如图所示&#xff1a; 二、解决方法&#xff1a; 1.打开tomcat配置页面&#xff0c;Edit Configurations。 2.选择项目部署的tomcat&#xff0c;在配置项VM options文本框中输入-Dfile.encodingUTF-8,点击Appl…

idea 控制台乱码问题的问题

工程(环境window10&#xff0c;gradle-6.8.3版本&#xff0c;编辑器IntelliJ IDEA 2019.3.4&#xff09; 一&#xff09;问题表现编译build的时候控制台带中文信息的会乱码 1、 找到Help->Editor Custom VM Options 2、 添加 -Dfile.encodingUTF-8 该设置是针对编辑器级别…

IDEA中控制台乱码的解决方式

1.在设置中的“文件编码”中将3个位置设为UTF-8&#xff0c;注&#xff1a;此处设置与控制台乱码无关&#xff0c;3处可均设为UTF-8或均设为系统默认值。 2.在Tomcat的“编辑配置”中&#xff0c;将VM options设为-Dfile.encodingGBK(与第三步类似&#xff0c;默认即为GBK)。…

IDEA控制台乱码终极解决办法

【关于IDEA中文乱码的终极解决方法】 查了很多资料&#xff0c;大多数博主都是修改四个地方&#xff1a;&#xff08;前四步&#xff09;如果前四步还是不行&#xff0c;可以看五、六步。第一步&#xff1a;idea 安装目录下/bin/idea.exe.vmoptions 和/bin/idea64.exe.vmoption…

IDEA控制台乱码解决

解决办法&#xff1a; 打开Intellij的安装的bin目录&#xff08;D:\Program Files\JetBrains\IntelliJ IDEA 14.0\bin &#xff09;&#xff0c;找到上图的两个文件&#xff08;根据你的系统是32位或64位选择其中一个配置文件&#xff09;&#xff0c;在配置文件中添加&#xf…

多种方法帮你解决tomcat项目部署,idea控制台乱码问题

解决在使用Tomcat过程中idea控制台出现的乱码问题 以下将介绍几种方法&#xff08;都是小编亲测实用的方法&#xff09;&#xff0c;尝试并寻找适合自己的方法即可 由于我已经处理过了乱码问题&#xff0c;我就重新配置一下 &#xff08;我有效解决的方案是把-Dfile.encoding…

idea 控制台乱码

1.我原来的修改idea的控制台乱码是 在ideasettings--Editor--File encodings修改为UTF-8 2.tomcat 中修改的conf logging.properties配置文件 由UTF-8修改为GBK 以上是我之前的修改.最近有个项目这样配置之后在项目运行的时候.有个页面要获取一个json字段.但是代码中有乱码的…