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

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍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
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件
前台线程接收到鼠标点击事件

在这里插入图片描述

以上。

  • 7
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
添加SFML到VSCode中主要需要以下几个步骤: 1. 首先,从SFML官方网站(https://www.sfml-dev.org/)下载相应版本的SFML。确保下载与您使用的编译器(如MinGW、Visual Studio等)兼容的。 2. 解压下载的文件,并将它们保存到您喜欢的位置,例如"C:\SFML"文件夹。 3. 打开VSCode,创建一个新的C++项目或打开现有项目。 4. 在项目的根目录下,创建一个名为".vscode"的文件夹(如果尚不存在)。 5. 在".vscode"文件夹中创建一个名为"tasks.json"的文件,并将以下代码添加到文件中: { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "${command:cmake.buildTarget}", "group": { "kind": "build", "isDefault": true }, "presentation": { "reveal": "always" }, "problemMatcher": [] } ] } 6. 在".vscode"文件夹中创建一个名为"launch.json"的文件,并将以下代码添加到文件中: { "version": "0.2.0", "configurations": [ { "name": "(gdb) 启动", "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/a.out", "args": [], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, "MIMode": "gdb", "miDebuggerPath": "/path/to/gdb" } ] } 7. 在VSCode的左侧菜单栏中选择"查看" -> "终端",以打开集成的终端。 8. 在终端中,使用cd命令导航到您的项目根目录。 9. 在终端中,运行以下命令以生成Makefile文件: cmake -DCMAKE_PREFIX_PATH="<SFML文件夹路径>" . 替换<SFML文件夹路径>为您在第2步中保存SFML的文件夹路径。 10. 在终端中,运行以下命令以编译并构建您的项目: make 11. 完成后,在终端中运行您的项目。 以上是在VSCode中添加SFML的基本步骤,使您能够在C++项目中使用SFML的功能和特性。根据不同的操作系统和编译器设置,某些步骤可能会有所不同,但整体流程基本相似。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DevFrank

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值