C++ SFML学习笔记之Text显示汉字

C++ SFML学习笔记之Text显示汉字

最近刚开始学习SFML,路上遇到了许多坑,但是我想,每解决一个问题就记录下来,一方面方便自己记忆,一方面避免大家跟我踩相同的坑。

显示中文的问题
我们写游戏,汉字问题是必不可少的,这里SFML提供了非常友好的Text类,显示英文没问题,只要

// textTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(400, 400), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
    sf::Font font;

    font.loadFromFile("arial.ttf");//-----第一个坑--------
    sf::Text text;

    text.setFont(font);

    text.setString("hello world!");//-----第二个坑--------

    text.setCharacterSize(24);

    text.setFillColor(sf::Color::Red);

    text.setStyle(sf::Text::Bold | sf::Text::Underlined);



    
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        window.clear();
        window.draw(shape);
        window.draw(text);//记得画出来
        window.display();
    }

    return 0;
}

第一个坑,没有字体文件的话,会报错,如果不写font的话,他也不会去找默认的字体(直接啥也不显示),我的解决办法是去控制面板字体库里选一个复制到主文件.cpp旁边去,这样显示就没问题了
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

第二个坑,中文乱码,,如果我们改成中文

text.setString("这里会显示乱码")

在这里插入图片描述

赶紧去百度,然后查官方文档,
在这里插入图片描述
大概意思是说,可以使用宽文本字符串(Wide String)

text.setString(L"这样就不会显示乱码")

再试试
在这里插入图片描述

反正是没有报错,但是好像是文本缺失,所以。。。换个字体?去网上随便找个字体
在这里插入图片描述

加载成功了,可能有点丑,去系统库里拿个中文字体也可以

那么新的问题来了,我把中文字段写在了一个vector里,

vector<string> contents = { "你好","这是一个demo1","这是一个demo2","这是一个demo3" }

,那么循环调用的时候

text.setString(contents2[i % 4])

,如果我写成

vector<string> contents2 = { L"你好",L"这是一个demo",L"这是一个demo",L"这是一个demo" }

,这样会报错,如果我写成

text.setString(L contents2[i % 4])

更会报错,怎么办呢?
我之前在优快云和知乎都发了提问,但是没人回,忽然,好像灵光一现的,是不是我vector的类型有问题,我之前是学python的,C++懂的不是很多,以为c++的L"string"和python的f"string"是差不多的东西,但其实不是,c++的L"string"的类型不再是string,而是wstring

std::vector<std::wstring> contents = { L"你好",L"这是一个demo1",L"这是一个demo2",L"这是一个demo3" };

报错消失了,以下贴出完整代码

// textTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(400, 400), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
    sf::Font font;

    font.loadFromFile("也字工厂山海明朝.ttf");
    sf::Text text;

    text.setFont(font);

    text.setCharacterSize(24);

    text.setFillColor(sf::Color::Red);

    text.setStyle(sf::Text::Bold | sf::Text::Underlined);
    std::vector<std::wstring> contents = { L"你好",L"这是一个demo1",L"这是一个demo2",L"这是一个demo3" };

    int i = 0;
    
    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        i++;
        text.setString(contents[i % 4]);
        window.clear();
        window.draw(shape);
        window.draw(text);
        window.display();
    }

    return 0;
}

变得太快是是吗,我们还可以加个Clock

    float timer1 = 0, timer2 = 0, delay = 1; //时间工具和延时
    sf::Clock clock;

时间累积

        timer2 = clock.getElapsedTime().asSeconds();//表示自上次调用 restart() 或计时器创建以来经过的时间
        clock.restart();
        timer1 += timer2;
        if (timer1 > delay) {
            i++;
            timer1 = 0;
        }

完整代码

// textTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <SFML/Graphics.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(400, 400), "SFML works!");
    sf::CircleShape shape(100.f);
    shape.setFillColor(sf::Color::Green);
    sf::Font font;

    font.loadFromFile("也字工厂山海明朝.ttf");
    sf::Text text;

    text.setFont(font);

    text.setCharacterSize(24);

    text.setFillColor(sf::Color::Red);

    text.setStyle(sf::Text::Bold | sf::Text::Underlined);
    std::vector<std::wstring> contents = { L"你好",L"这是一个demo1",L"这是一个demo2",L"这是一个demo3" };

    int i = 0;
    float timer1 = 0, timer2 = 0, delay = 1; //时间工具和延时
    sf::Clock clock;

    while (window.isOpen())
    {
        sf::Event event;
        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }
        timer2 = clock.getElapsedTime().asSeconds();//表示自上次调用 restart() 或计时器创建以来经过的时间
        clock.restart();
        timer1 += timer2;
        if (timer1 > delay) {
            i++;
            timer1 = 0;
        }
        
        text.setString(contents[i % 4]+std::to_wstring(timer1));
        window.clear();
        window.draw(shape);
        window.draw(text);
        window.display();
    }

    return 0;
}

在这里插入图片描述

<think>好的,我需要帮助用户配置SFML开发环境。用户可能使用的是Visual Studio,因为引用中提到了VS2019和VS2022。我需要整理步骤,确保清晰易懂。 首先,确认用户下载正确的SFML版本。根据编译器版本选择,这一点很重要,否则会有兼容性问题。用户需要从官网下载,然后解压到合适的位置。 接下来是配置包含目录和库目录。引用[3]提到,需要在项目属性中添加包含目录和库目录。包含目录指向SFML的include文件夹,库目录指向lib文件夹。这部分需要详细说明路径设置。 然后是链接器输入,添加依赖项。根据引用[1]和[4],需要添加具体的.lib文件。这里要注意动态库和静态库的区别,动态库使用-s后缀,静态库可能需要其他配置。用户可能需要根据项目需求选择,动态库更常见,所以先建议动态链接。 接着是复制DLL文件到项目目录,这一步容易遗漏,导致运行时出错。需要提醒用户将bin目录下的DLL文件复制到可执行文件所在的目录,比如Debug或Release文件夹。 测试代码部分,引用[2]提供了一个简单的图形窗口示例。用户编译运行这个代码可以验证配置是否成功。如果有错误,可能需要检查路径是否正确,或者依赖项是否遗漏。 最后,常见问题处理。比如路径错误、32/64位不匹配、DLL缺失等。这些都是新手常遇到的问题,提前说明可以帮助用户自行排查。 需要参考用户提供的引用,确保步骤准确。同时,语言要简洁明了,分步骤说明,让用户能一步步跟着操作。可能还需要注意不同VS版本的界面差异,但引用中的步骤大体相似,可以通用。</think>### Visual Studio 配置SFML环境教程 #### 一、准备工作 1. **下载SFML** 前往[SFML官网](https://www.sfml-dev.org/download.php)下载与Visual Studio版本匹配的预编译库(例如:VS2019选择`vc16`,VS2022选择`vc17`)[^3]。 2. **解压文件** 将下载的压缩包解压到固定目录(例如:`D:\SFML-2.6.1`),确保路径不含中文或空格。 --- #### 二、项目配置步骤 1. **设置包含目录** - 右键项目 → 属性 → **C/C++** → **常规** → **附加包含目录** - 添加SFML的`include`目录,例如:`D:\SFML-2.6.1\include` 2. **设置库目录** - 切换到**链接器** → **常规** → **附加库目录** - 添加SFML的`lib`目录,例如:`D:\SFML-2.6.1\lib`[^3] 3. **添加依赖项** - **链接器** → **输入** → **附加依赖项** - 根据模块需求添加库文件(动态链接版示例): ```text sfml-graphics-d.lib sfml-window-d.lib sfml-system-d.lib sfml-audio-d.lib sfml-network-d.lib ``` 注意:`-d`后缀表示Debug模式,Release模式需改为`-s`后缀(如`sfml-graphics-s.lib`)[^1][^4] 4. **复制动态链接库(DLL)** 将SFML的`bin`目录下所有`.dll`文件复制到项目生成的`Debug`或`Release`文件夹中[^3]。 --- #### 三、测试代码 ```cpp #include <SFML/Graphics.hpp> int main() { sf::RenderWindow window(sf::VideoMode(800, 600), "SFML Test"); while (window.isOpen()) { sf::Event event; while (window.pollEvent(event)) { if (event.type == sf::Event::Closed) window.close(); } window.clear(); window.display(); } return 0; } ``` 编译运行后若显示空白窗口,表示配置成功[^2]。 --- #### 四、常见问题 1. **运行时提示缺少DLL** 检查是否将`bin`目录下的DLL文件复制到可执行文件目录。 2. **链接错误`LNK2019`** 确认附加依赖项的库文件名是否拼写正确,且与编译模式(Debug/Release)匹配[^1]。 3. **32位与64位冲突** 确保SFML库版本与项目平台(x86/x64)一致[^3]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值