sf :: Font :: loadFromFile使程序崩溃

时间:2015-12-25 21:42:10

标签: c++ windows crash sfml

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

这样做,我在运行程序时遇到了问题,甚至使用了教程。

我已经尝试过调试它,但没有看到任何问题,但是在运行时,关于它绘制文本的位置,会出现一个对话框,说出" text.exe已停止工作"

我正在运行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;
}

1 个答案:

答案 0 :(得分:1)

你这样做:

font.loadFromFile("arial.ttf")

在没有延迟的循环中。该字体应该在程序开始时加载一次,否则操作系统和您的防病毒软件将不喜欢您的程序正在执行的操作(反复访问磁盘上的同一文件太长时间)。

关于延迟,你应该:

window.setVerticalSyncEnabled(true);

与60FPS(可能)同步,因为你也在最大限度地利用CPU线程/ 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;
}