sf::Font::loadFromFile 程序崩溃

sf::Font::loadFromFile crashing the program

我最近一直在测试 SFML 2.3 中的一些功能,并且开始熟悉 C++。 玩玩之后,我决定尝试将文本添加到程序中,使用 sf::Textsf::Font.

这样做后,我在 运行 程序时遇到了问题,甚至使用它的教程也是如此。

我试过调试它,但没有发现任何问题,但是当 运行,关于它绘制的点 'text',出现一个对话框说 "text.exe has stopped working"

我是 运行 Windows 10 10586,我使用的是 VS2012 Professional。

我有下面的代码,是我目前所拥有的。

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

int main()
{
    sf::RenderWindow window(sf::VideoMode(800,600),"Text Test");
    sf::Text text;
    sf::Font font;
    std::cout << "Created the Window." << std::endl;
    std::cout << "Loaded Text and Font classes" << std::endl;

    while (window.isOpen())
    {
        sf::Event event;
        std::cout << "Created window Function loop" << std::endl;

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        if (!font.loadFromFile("arial.ttf"))
        {
            std::cout << "Program Halted." << std::endl;
            std::exit(-1);
        }

        std::cout << "Loaded Fonts." << std::endl;
        text.setFont(font);
        text.setString("I am a Test");
        text.setCharacterSize(20);

        window.clear();
        window.draw(text);
        window.display();
    }
    return 0;
}

您正在这样做:

font.loadFromFile("arial.ttf")

在没有延迟的循环中。字体应在程序启动时加载一次,否则 OS 并且您的防病毒软件将不喜欢您的程序正在执行的操作(重复访问磁盘上的同一文件时间过长)。

关于延迟,你应该有:

window.setVerticalSyncEnabled(true);

与 60FPS 同步(可能),因为您也达到了最大值 CPU thread/GPU。

生成的代码,删除了一些非描述性输出消息:

int main()
{
    sf::RenderWindow window(sf::VideoMode(800,600),"Text Test");
    window.setVerticalSyncEnabled(true);
    std::cout << "Created the Window." << std::endl;

    sf::Text text;
    sf::Font font;

    if (!font.loadFromFile("arial.ttf"))
    {
        std::cout << "Program Halted." << std::endl;
        std::exit(-1);
    }

    std::cout << "Loaded Fonts." << std::endl;
    text.setFont(font);
    text.setString("I am a Test");
    text.setCharacterSize(20);

    while (window.isOpen())
    {
        sf::Event event;

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.clear();
        window.draw(text);
        window.display();
    }

    return 0;
}