gpt4 book ai didi

c++ - 如何在 sf::RectangleShape 中居中 sf::Text

转载 作者:行者123 更新时间:2023-11-27 23:47:36 27 4
gpt4 key购买 nike

有没有一种简单的方法可以使 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 个单位,我必须将原点设置为 -5 而不是 5

常量只是为了让整行代码更具可读性。您也可以在线执行所有操作,但我更喜欢更简洁的方式。

下面是使用 Arial 和 Lucida 手写的全部操作:

Example Screenshot

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

关于c++ - 如何在 sf::RectangleShape 中居中 sf::Text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49346432/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com