SFML 2.4.2 在绘制 sf::Text 对象之前获取 localBounds

SFML 2.4.2 getting localBounds before drawing sf::Text object

我正在做一个需要用 SFML 完成一些按钮的项目。我们使用的是 2.4.2 版。除了文本对齐,我已经设法完成了所有事情,我对问题出在哪里感到很困惑。

为了设置文本的对齐方式,我知道我必须正确设置它的原点和位置。由于人们可能会更改按钮的文本,因此我决定将对齐功能放入 setString 函数中。

出于调试目的,我添加了几个控制台输出来显示我的一些数据。该函数如下所示:

void rgf::Button::setString(const sf::String & str)
{
    text.setString(str);

    std::cout << "Original Origin: " << text.getOrigin().x << ", " << text.getOrigin().y << std::endl;
    std::cout << "Original Position: " << text.getPosition().x << ", " << text.getPosition().y << std::endl;
    std::cout << "Original LocalBounds: " << text.getLocalBounds().width << ", " << text.getLocalBounds().height << std::endl;

    auto textRect = text.getLocalBounds();
    auto btnRect = body.getLocalBounds();
    text.setOrigin(textRect.left + textRect.width / 2, textRect.height + textRect.height / 2);
    text.setPosition(btnRect.left + btnRect.width / 2, btnRect.top + btnRect.height / 2);

    std::cout << "New Origin: " << text.getOrigin().x << ", " << text.getOrigin().y << std::endl;
    std::cout << "New Position: " << text.getPosition().x << ", " << text.getPosition().y << std::endl;
    std::cout << "New LocalBounds: " << text.getLocalBounds().width << ", " << text.getLocalBounds().height << std::endl;
}

控制台将所有新旧位置输出为 0(新位置除外,returns 预期坐标为 50 和 25)。

根据我在网上找到的信息,一旦我设置了文本的字符串,我的文本对象的 localBounds 就会发生变化。除非文本已经在 sf::RenderWindow.

中绘制过一次,否则不会发生这种情况

我这样做是为了让按钮的功能将字符串设置为另一个值,这具有正确设置原点和位置的效果。在容器的构造函数中设置字符串的值(在绘制之前)没有正确设置原点。

我在这上面花了一天时间,但我不明白我错过了什么。任何帮助将不胜感激。

在setString()函数之后调用了setFont()函数,这意味着localBounds仍然是0,因为没有表示宽度或高度的字体。