2013-05-07 6 views
1

나는 클래스를 만들어 일부 정점과 문자열을 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; 

    ... 
}; 

} 

을하지만 텍스트를 그릴 때, 프로그램은 잘 컴파일,하지만 난 그것을 실행하면 즉시 충돌합니다.

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

가 어떻게이 문제를 해결 것 : 여기

은 GDB에서 역 추적입니까?

답변

7

글꼴 개체를 유지하지 않기 때문입니다.

documentation를 참조하십시오

김포 :: 텍스트 인스턴스가 그것이 만에 대한 참조를 유지, 사용하는 폰트를 복사하지 않는 것이 중요합니다. 그러므로 sf :: Font는 sf :: Text에 의해 사용되는 동안 파괴되지 않아야합니다. 즉, 텍스트를 생성하기 위해 로컬 sf :: Font 인스턴스를 사용하는 함수를 작성하지 마십시오.

+0

글꼴 개체를 어떻게 유지합니까? 'sf :: Font font;'를 생성자 대신 클래스로 옮겨야합니까? – Darkwater

+1

예, 수업에 참여하십시오. 지금은 생성자에서 생성되고 파기됩니다. 0 매개 변수를 사용하기 때문에 초기화 목록을 작성할 필요조차 없습니다. –

관련 문제