2013-05-07 34 views
1

我制作了一个Button类,它应该绘制一些顶点和一个字符串到RenderWindow。下面是使用无关片剪掉了代码:(here是完整的代码)使用SFML绘制文本时出现Segfault

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() 

我将如何解决这个问题?

回答

7

我想这是因为你没有保持字体对象的活着。

documentation

需要注意的是SF :: Text实例不会复制它使用的,它只是保存一个对它的引用的字体是很重要的。因此,当sf :: Text使用sf :: Font时,sf :: Font不能被破坏(即从不写入使用本地sf :: Font实例创建文本的函数)。

+0

我该如何让字体对象保持活动状态?我应该将sf :: Font字体移到类而不是构造函数吗? – Darkwater 2013-05-07 21:13:49

+1

是的,让它成为你班上的一员。现在它在您的构造函数中创建并销毁。因为它需要0个参数,所以你甚至不需要创建一个初始化列表。 – 2013-05-07 21:42:21