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

article/2025/9/29 21:48:09

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

文章目录

    • :smirk:1. SFML库介绍
    • :blush:2. SFML库安装
    • :satisfied:3. SFML库使用

😏1. SFML库介绍

SFML (Simple and Fast Multimedia Library) 是一个开源的、跨平台的C++多媒体库,它提供了一系列简单易用的接口和工具,可以方便地创建各种图形、音频、视频等应用程序。SFML 支持 Windows, Linux, macOS 和 Android 四种操作系统。

SFML 提供了以下功能:

窗口管理:创建窗口,处理输入事件(键盘,鼠标),显示图像
图形绘制:支持 2D图形绘制,包括基本图形(点,线,矩形,圆等)、渲染纹理、精灵动画等
音频处理:支持 PCM 音频流播放、录制,以及音量控制、特效等
网络通信:支持 TCP 和 UDP 协议的网络通信
多线程处理:支持多线程并发处理,可以在主线程上更新窗口和处理输入事件

😊2. SFML库安装

SFML官网:https://www.sfml-dev.org/index.php

可通过apt或source code的方式安装,这里用的apt安装。

在Linux开发环境中,通过这条命令安装:sudo apt-get install libsfml-dev

😆3. SFML库使用

下面创建一个示例程序,来验证SFML安装成功:

一个窗口绘制示例:

#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;
}

编译程序:

g++ -c main.cpp
g++ main.o -o sfml-app -lsfml-graphics -lsfml-window -lsfml-system
./sfml-app

运行如下:

在这里插入图片描述

一个音频处理示例:

#include <SFML/Audio.hpp>
#include <iostream>// 自定义音频处理函数
void processAudio(sf::Int16* samples, std::size_t sampleCount) {// 遍历每个样本并进行处理(示例:将音量降低一半)for (std::size_t i = 0; i < sampleCount; ++i) {samples[i] /= 2;}
}int main() {// 加载音频文件sf::SoundBuffer buffer;if (!buffer.loadFromFile("audio.wav")) {std::cout << "无法加载音频文件" << std::endl;return EXIT_FAILURE;}// 获取音频数据const sf::Int16* samples = buffer.getSamples();std::size_t sampleCount = buffer.getSampleCount();// 处理音频数据processAudio(const_cast<sf::Int16*>(samples), sampleCount);// 播放处理后的音频sf::Sound sound;sound.setBuffer(buffer);sound.play();// 等待音频播放完成while (sound.getStatus() == sf::Sound::Playing) {}return EXIT_SUCCESS;
}

程序编译:

g++ main.cpp -o main -lsfml-audio -lsfml-system
# 运行如下,我现在没有音频文件
Failed to open sound file "audio.wav" (couldn't open stream)
无法加载音频文件

一个网络处理-tcpclient示例:

#include <SFML/Network.hpp>
#include <iostream>int main() {// 创建TCP套接字sf::TcpSocket socket;// 连接到服务器sf::IpAddress serverIp = "127.0.0.1"; // 服务器IP地址unsigned short serverPort = 12345; // 服务器端口号sf::Socket::Status status = socket.connect(serverIp, serverPort);if (status != sf::Socket::Done) {std::cout << "无法连接到服务器" << std::endl;return EXIT_FAILURE;}// 发送数据到服务器std::string message = "Hello Server!";status = socket.send(message.c_str(), message.size() + 1); // 发送包括空字符在内的全部消息内容if (status != sf::Socket::Done) {std::cout << "发送消息失败" << std::endl;return EXIT_FAILURE;}// 接收服务器的响应char buffer[1024];std::size_t received;status = socket.receive(buffer, sizeof(buffer), received);if (status != sf::Socket::Done) {std::cout << "接收响应失败" << std::endl;return EXIT_FAILURE;}// 输出服务器的响应std::cout << "服务器的响应: " << buffer << std::endl;// 关闭套接字连接socket.disconnect();return EXIT_SUCCESS;
}

程序编译:

g++ main.cpp -lsfml-network -lsfml-system

一个多线程处理示例:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <thread>// 线程函数
void threadFunction() {// 在后台线程中执行任务for (int i = 0; i < 5; ++i) {std::cout << "后台线程执行任务 " << i << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));}
}int main() {// 创建窗口sf::RenderWindow window(sf::VideoMode(800, 600), "SFML 多线程示例");// 创建后台线程std::thread thread(&threadFunction);// 渲染循环while (window.isOpen()) {// 处理事件sf::Event event;while (window.pollEvent(event)) {if (event.type == sf::Event::Closed) {// 关闭窗口时停止后台线程并退出程序thread.join();window.close();}else if (event.type == sf::Event::MouseButtonPressed) {// 单击窗口时输出消息std::cout << "前台线程接收到鼠标点击事件" << std::endl;}}// 清空窗口window.clear(sf::Color::White);// 刷新窗口window.display();}return EXIT_SUCCESS;
}

程序编译:

g++ main.cpp -lsfml-graphics -lsfml-window -lsfml-system -lpthread
运行如下:
后台线程执行任务 0
后台线程执行任务 1
后台线程执行任务 2
后台线程执行任务 3
后台线程执行任务 4
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件

在这里插入图片描述

以上。


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

相关文章

使用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字段.但是代码中有乱码的…

IDEA控制台乱码问题,原因解决方式,解决不了算我输

IDEA 控制台乱码问题 文章目录 IDEA 控制台乱码问题为了节省大家时间, 直接展示下我的编码配置方案我的编码配置原则我的编码配置 另外说一下几个重要但是和乱码无关的配置乱码原因解决方式我为什么推荐控制台使用 GBK我的编码设置思想第一种解决方案的弊端end 附加技巧如何找出…

解决idea控制台乱码

控制台乱码如下&#xff1a; 解决方案一&#xff1a;修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 上方导航栏“Run→Edit Configurations…”进入配置页面&#xff0c;修改当前 Web 项目 Tomcat Server 的虚拟机输出选项 VM options 添加 -Dfile.encodingUTF-8 。重启&…

IDEA控制台乱码(已解决)

先来说说我遇到的问题&#xff0c;用IDEA打开项目首先可以保证编辑器内不会乱码&#xff0c;启动Tomcat后控制台出现乱码   我在网上找了很多方式都没有解决&#xff0c;大多数的方式由以下几种&#xff1a; 进入File->Settings->Editor->File Encodings 将右侧的所…