如何在sf :: RectangleShape中居中sf :: Text

时间:2018-03-18 09:38:12

标签: c++ sfml centering

是否有一种简单的方法可以将sf::Text对象置于sf::RectangleShape对象中?

文本长度可变,但创建后不会发生变化。

我正在使用SFML 2.4。

1 个答案:

答案 0 :(得分:3)

将一个对象置于另一个对象上通常是一项微不足道的任务:只需确定对象之间的大小差异,然后将其除以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个单位,我必须将原点设置为{ {1}}而不是-5

常量实际上就是让整行更具可读性。你也可以做内联的所有事情,但我更喜欢更清洁的方式。

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

Example Screenshot

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