【问题标题】:How to center a sf::Text in a sf::RectangleShape如何在 sf::RectangleShape 中居中 sf::Text
【发布时间】:2018-08-27 00:53:31
【问题描述】:

有没有一种简单的方法可以让sf::Text 对象在sf::RectangleShape 对象中居中?

文本具有可变长度,但在创建后不会更改。

我正在使用 SFML 2.4。

【问题讨论】:

    标签: c++ sfml centering


    【解决方案1】:

    将一个对象居中放在另一个对象上通常是一项微不足道的任务:只需确定对象之间的大小差异,然后通过将其除以 2 将其用作偏移量。

    但是,一旦使用 (True Type) 字体渲染,事情就会变得有点棘手,因为这些字体字形的来源不一定位于实际字形的左上角。它可能在任何地方,具体取决于要呈现的字体和字符/字形(衬线和其他装饰元素是一个典型示例)。

    回到基本公式:

    offset = (shape.size() - text.size()) / 2
    

    现在让我们添加文本偏移:

    offset = (shape.size() - text.size()) / 2 - text.offset()
    

    使用 SFML 有多种方法可以做到这一点。就我个人而言,我可能会创建我的自定义 sf::Drawable 派生类来绘制框和文本。

    对于独立绘图(就像你一样),我实际上更喜欢设置文本的原点来解释偏移量。通过这种方式,您可以将形状和文本的位置设置为相同,并且它们将完美对齐,而无需再次触摸原点/偏移量(除非您更改文本)。

    const sf::FloatRect bounds(text.getLocalBounds());
    const sf::Vector2f box(shape.getSize());
    text.setOrigin((bounds.width - box.x) / 2 + bounds.left, (bounds.height - box.y) / 2 + bounds.top);
    

    请注意,由于我设置的是原点而不是偏移量,因此我基本上交换了操作数。例如,要将文本向右移动 5 个单位,我必须将原点设置为 @ 987654328@ 而不是5

    这个常量实际上只是为了使整行更具可读性。您也可以内联执行所有操作,但我更喜欢更简洁的方式。

    这是使用 Arial 和 Lucida 手写的全部内容:

    请注意,“Hello World”的对齐方式会有所不同,具体取决于字体字形是否向下占用更多空间。如果您不希望这种行为,则必须使用一些固定的行高,而不是依赖于 sf::Text 对象的高度。

    【讨论】:

    • 请注意,我已经稍微更新了代码,因为您不应该将文本偏移量减半。
    • 不要为我工作。我的结果:link 我的代码:link
    • @Profilefter 你忘了设置文本的位置。
    • @Profilefter 看我的例子;与形状/框/其他位置相同。
    • 哦,实际上只是注意到我没有包含完整的源文本。但无论哪种方式,如果您使用原点,基本上就是这样:将两者设置为相同的位置。您也可以直接将实际偏移量添加到您的位置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多