【问题标题】:Segfault when drawing text with SFML使用 SFML 绘制文本时出现段错误
【发布时间】:2013-05-01 23:03:31
【问题描述】:

我创建了一个Button 类,它应该将一些顶点和一个字符串绘制到RenderWindow。这是剪掉不相关部分的代码:(here 是完整代码)

namespace game {

class Button
{
public:
    Button(int _x, int _y, int _width, int _height, std::string text)
    {
        ...

        sf::Font font;
        font.loadFromFile("res/SF Intermosaic B.ttf");
        label.setFont(font);
        label.setString(text);
        label.setCharacterSize(16);
        label.setColor(sf::Color(20, 20, 20));

        ...
    }

    ...

    void draw(sf::RenderWindow& window) const
    {
        sf::RenderStates states;
        states.texture = &texture;

        window.draw(vertices[state], states);
        window.draw(label); // If this line is commented out, there's no error.
    }

private:
    ...

    sf::Text label;

    ...
};

}

但是当我绘制文本时,程序编译得很好,但是当我运行它时,它立即崩溃。

这是来自 gdb 的回溯:

#0  0x00007ffff7bad604 in sf::Font::getTexture(unsigned int) const () from /usr/local/lib/libsfml-graphics.so.2
#1  0x00007ffff7bcd626 in sf::Text::draw(sf::RenderTarget&, sf::RenderStates) const () from /usr/local/lib/libsfml-graphics.so.2
#2  0x00007ffff7bc5bf4 in sf::RenderTarget::draw(sf::Drawable const&, sf::RenderStates const&) () from /usr/local/lib/libsfml-graphics.so.2
#3  0x00000000004033ad in game::Button::draw(sf::RenderWindow&) const ()
#4  0x0000000000403b64 in game::Menu::draw(sf::RenderWindow&) const ()
#5  0x00000000004042c5 in game::State::draw() ()
#6  0x0000000000402b4d in main ()

我将如何解决这个问题?

【问题讨论】:

    标签: c++ sfml


    【解决方案1】:

    我猜是因为你没有让字体对象保持活动状态。

    documentation

    重要的是要注意 sf::Text 实例不会复制它使用的字体,它只保留对它的引用。因此,当 sf::Text 使用 sf::Font 时,不得破坏它(即永远不要编写使用本地 sf::Font 实例来创建文本的函数)。

    【讨论】:

    • 如何让字体对象保持活动状态?我应该将sf::Font font; 移动到类而不是构造函数吗?
    • 是的,让它成为你班级的一员。现在它在您的构造函数中创建和销毁。因为它需要0个参数,你甚至不需要创建一个初始化列表。
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 2020-04-16
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2020-04-23
    • 2014-09-12
    • 1970-01-01
    相关资源
    最近更新 更多