SFML开发中如何使用百分比值设置sprite.setOrigin原点坐标
结论
完全可以,这也是SFML中适配不同尺寸精灵对齐需求的常用实现方案。
实现逻辑
sf::Sprite::setOrigin() 接收的是精灵本地坐标系的像素偏移值,本身就和精灵/纹理的实际尺寸强关联,用百分比换算刚好可以屏蔽不同资源的尺寸差异,实现自适应对齐。
你需要的「底部对齐自身坐标中心点」的效果,刚好对应x轴取宽度的50%、y轴取高度的100%的百分比值,你可以封装一个通用工具函数复用逻辑:
// 按百分比设置精灵原点,xPercent、yPercent取值范围0~100 void setOriginByPercent(sf::Sprite& sprite, float xPercent, float yPercent) { sf::FloatRect localBounds = sprite.getLocalBounds(); sprite.setOrigin( localBounds.width * xPercent / 100.f, localBounds.height * yPercent / 100.f ); }
调用示例
不管是64×64的石头还是128×128的树木,统一调用即可,不需要单独适配尺寸:
sf::Sprite stoneSprite, treeSprite; // 加载纹理的逻辑省略... // 统一设置原点为底部中心点 setOriginByPercent(stoneSprite, 50, 100); setOriginByPercent(treeSprite, 50, 100);
按这个逻辑计算:
- 石头精灵的原点最终为(32, 64),刚好是自身底部中心点
- 树木精灵的原点最终为(64, 128),也刚好是自身底部中心点
完全符合你的对齐要求。
注意事项
- 后续给精灵设置缩放
setScale()不需要重新计算原点,原点是基于精灵本地未缩放的尺寸定义的,缩放后对齐逻辑依然生效 - 如果用
setTextureRect()裁剪过纹理,getLocalBounds()会自动返回裁剪后的区域尺寸,百分比计算逻辑不需要修改就能适配裁剪后的精灵
内容的提问来源于stack exchange,提问作者Karo
相关产品推荐
相关产品推荐

