首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在sf::RectangleShape中对sf::文本进行居中

如何在sf::RectangleShape中对sf::文本进行居中
EN

Stack Overflow用户
提问于 2018-03-18 09:38:11
回答 1查看 1.7K关注 0票数 3

是否有一种简单的方法在sf::Text对象中对sf::RectangleShape对象进行居中?

文本有可变的长度,但在创建后不会改变。

我正在使用SFML 2.4。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-18 10:46:42

将一个对象对另一个对象进行中心化通常是一项琐碎的任务:只需确定对象之间的大小差异,并将其除以2作为偏移量。

但是,一旦使用了(True Type)字体呈现,事情就变得更加棘手了,因为这些字体符号的来源不一定在实际字形的左上角。它可能在任何地方,取决于字体和要呈现的字符/字形(衬线和其他装饰元素是这方面的典型例子)。

回到基本公式:

代码语言:javascript
复制
offset = (shape.size() - text.size()) / 2

现在让我们添加文本偏移量:

代码语言:javascript
复制
offset = (shape.size() - text.size()) / 2 - text.offset()

使用SFML有多种方法可以做到这一点。就我个人而言,我可能会创建我的自定义sf::Drawable派生类,绘制框和文本。

对于独立绘图(就像您所做的),我实际上更喜欢将文本的原点设置为偏移量。通过这种方式,您可以同时设置形状和文本的位置,并且它们将完全对齐,而不会再次触及原点/偏移(除非您更改文本)。

代码语言:javascript
复制
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对象的高度。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49346432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档