是否有一种简单的方法在sf::Text对象中对sf::RectangleShape对象进行居中?
文本有可变的长度,但在创建后不会改变。
我正在使用SFML 2.4。
发布于 2018-03-18 10:46:42
将一个对象对另一个对象进行中心化通常是一项琐碎的任务:只需确定对象之间的大小差异,并将其除以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笔迹的整个动作:

注意"Hello“是如何对齐的,这取决于字体是否向下占用更多的空间。如果您不想要这种行为,就必须使用一些固定的行高,而不是依赖于sf::Text对象的高度。
https://stackoverflow.com/questions/49346432
复制相似问题