【发布时间】:2018-08-27 00:53:31
【问题描述】:
有没有一种简单的方法可以让sf::Text 对象在sf::RectangleShape 对象中居中?
文本具有可变长度,但在创建后不会更改。
我正在使用 SFML 2.4。
【问题讨论】:
有没有一种简单的方法可以让sf::Text 对象在sf::RectangleShape 对象中居中?
文本具有可变长度,但在创建后不会更改。
我正在使用 SFML 2.4。
【问题讨论】:
将一个对象居中放在另一个对象上通常是一项微不足道的任务:只需确定对象之间的大小差异,然后通过将其除以 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 对象的高度。