显示来自另一个类的sf :: Text对象的文本。 SFML

时间:2017-03-30 17:14:07

标签: c++ xcode sfml

我正在尝试创建一个类,它将创建一个带有一些白色文本的黑盒子。它最终能够根据发送给类的字符串来缩放框的大小。但是,首先,我不知道为什么文本不显示。我很感激帮助。

这是TextBox.h

class TextBox{

public:

sf::RectangleShape rect;
sf::Text text;
sf::Font font;

TextBox(std::string str, sf::Font f);
sf::Text getText();

这是TextBox.cpp中的TextBox构造函数。我发送给构造函数的sf :: Font是由SFML设置的字体。

#include "TextBox.h"
#include "string"

TextBox::TextBox(std::string str, sf::Font font){

rect.setFillColor(sf::Color::Black);
rect.setPosition(20, 20);
rect.setSize(sf::Vector2f(120,120));

text.setFont(font);
text.setString(str);
text.setCharacterSize(24);
text.setFillColor(sf::Color::White);

text.setPosition(rect.getPosition());

}

这是main.cpp中应该显示Rect和Text

的代码
sf::Font font;
if (!font.loadFromFile(resourcePath() + "sansation.ttf")) {
    return EXIT_FAILURE;
}

TextBox textBox("This Box", font);
textBox.text.setStyle(sf::Text::Bold);
// Start the game loop
while (window.isOpen())
{
    // Process events
    sf::Event event;
    while (window.pollEvent(event))
    {
        // Close window: exit
        if (event.type == sf::Event::Closed) {
            window.close();
        }

        // Escape pressed: exit
        if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape) {
            window.close();
        }
    }

    // Clear screen
    window.clear();

    window.draw(textBox.rect);
    window.draw(textBox.text);

    // Update the window
    window.display();

我尝试使用返回sf :: Text对象的公共getText()方法,但它没有解决问题。 此外,我为rect做的修改工作,并显示rect。文字不是。

谢谢你和干杯

1 个答案:

答案 0 :(得分:1)

来自sf::Text::setFont() method

  

font参数指的是只要文本使用它就必须存在的字体。实际上,文本并不存储自己的字体副本,而是保留指向您传递给此函数的指针。如果字体被销毁并且文本尝试使用它,则行为未定义。

TextBox构造函数中,您将font作为副本f传递,在初始化textBox后,字体副本f将被销毁,因此您的<{1}}未显示。

修复它很简单:使用pass by(常量)引用传递textBox.textfont

(您可能也希望将TextBox(std::string str, const sf::Font& f);作为const引用传递)