如何将 sf::Text 在 sf::RectangleShape 中居中
How to center a sf::Text in a sf::RectangleShape
有没有一种简单的方法可以将 sf::Text
对象置于 sf::RectangleShape
对象的中心?
文本的长度可变,但在创建后不会改变。
我正在使用 SFML 2.4。
将一个对象置于另一个对象的中心通常是一项微不足道的任务:只需确定对象之间的大小差异并将其除以 2 作为偏移量。
但是,一旦您使用 (True Type) 字体渲染,事情就会变得有点棘手,因为这些字体字形的起点不一定在实际字形的左上角。它可能在任何地方,具体取决于要呈现的字体和 character/glyph(衬线和其他装饰元素是一个典型的例子)。
回到基本公式:
offset = (shape.size() - text.size()) / 2
现在让我们添加文本偏移量:
offset = (shape.size() - text.size()) / 2 - text.offset()
有多种方法可以使用 SFML 执行此操作。就个人而言,我可能会创建我的自定义 sf::Drawable
派生 class 绘制框和文本。
对于独立绘图(就像您所做的那样),我实际上更喜欢设置文本的原点以说明偏移量。这样您就可以将形状和文本的位置设置为相同,并且它们将完全对齐而无需再次触摸 origin/offset(除非您更改文本)。
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 手写的整个过程:
请注意 "Hello World" 的对齐方式因字体字形是否向下占用更多 space 而不同。如果你不想要这种行为,你必须使用一些固定的行高而不是依赖于 sf::Text
对象的高度。
有没有一种简单的方法可以将 sf::Text
对象置于 sf::RectangleShape
对象的中心?
文本的长度可变,但在创建后不会改变。
我正在使用 SFML 2.4。
将一个对象置于另一个对象的中心通常是一项微不足道的任务:只需确定对象之间的大小差异并将其除以 2 作为偏移量。
但是,一旦您使用 (True Type) 字体渲染,事情就会变得有点棘手,因为这些字体字形的起点不一定在实际字形的左上角。它可能在任何地方,具体取决于要呈现的字体和 character/glyph(衬线和其他装饰元素是一个典型的例子)。
回到基本公式:
offset = (shape.size() - text.size()) / 2
现在让我们添加文本偏移量:
offset = (shape.size() - text.size()) / 2 - text.offset()
有多种方法可以使用 SFML 执行此操作。就个人而言,我可能会创建我的自定义 sf::Drawable
派生 class 绘制框和文本。
对于独立绘图(就像您所做的那样),我实际上更喜欢设置文本的原点以说明偏移量。这样您就可以将形状和文本的位置设置为相同,并且它们将完全对齐而无需再次触摸 origin/offset(除非您更改文本)。
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 手写的整个过程:
请注意 "Hello World" 的对齐方式因字体字形是否向下占用更多 space 而不同。如果你不想要这种行为,你必须使用一些固定的行高而不是依赖于 sf::Text
对象的高度。