是否有一种简单的方法可以将sf::Text
对象置于sf::RectangleShape
对象中?
文本长度可变,但创建后不会发生变化。
我正在使用SFML 2.4。
答案 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手写的全部内容:
请注意“Hello World”的对齐方式取决于字体字形是否会向下占用更多空间。如果您不想要这种行为,则必须使用一些固定的行高而不是依赖5
对象的高度。