如何在SFML中将sf::Text的原点设置为文本内容的中心
SFML sf::Text 设置原点为内容中心的正确方案
错误原因
你之前使用getCharacterSize()计算原点的方式无法生效,原因是该方法返回的是字体设定的字号值,和当前文本实际渲染后的尺寸没有关联:不同字符宽度、文本长度、字体glyph偏移都会导致实际渲染范围和字号不符,自然无法得到正确的中心点坐标。
正确实现代码
通过getLocalBounds()获取文本在局部坐标系下的实际包围盒,基于包围盒的尺寸和偏移计算中心点:
// 获取文本局部包围盒,包含实际渲染的宽高和左上角偏移 sf::FloatRect textLocalBound = topTextObj.getLocalBounds(); // 将原点设置为包围盒的中心点 topTextObj.setOrigin( textLocalBound.left + textLocalBound.width / 2.0f, textLocalBound.top + textLocalBound.height / 2.0f );
注意事项
- 每次修改文本的内容、字号、字体、字间距等会影响渲染尺寸的属性后,需要重新执行上述代码更新原点
- 不要使用
getGlobalBounds()计算原点,该方法返回的是经过位移、旋转、缩放后的世界坐标系包围盒,用于设置局部原点会得到错误结果 - 如果你为文本设置了轮廓效果,
getLocalBounds()默认会包含轮廓的渲染范围,如果你不需要将轮廓计入原点计算,可以手动减去轮廓厚度的偏移
内容的提问来源于stack exchange,提问作者marco
相关产品推荐
相关产品推荐

