- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有一种简单的方法可以使 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 手写的全部操作:
请注意“Hello World”如何根据字体字形是否向下占用更多空间而以不同方式对齐。如果您不想要这种行为,则必须使用一些固定的行高而不是依赖于 sf::Text
对象的高度。
关于c++ - 如何在 sf::RectangleShape 中居中 sf::Text,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49346432/
我是一名优秀的程序员,十分优秀!