You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在LibGDX与Box2D中正确绘制旋转的NinePatch?

解决LibGDX中Box2D物体与NinePatch旋转原点不匹配的性能优化方案

问题核心

用LibGDX结合Box2D开发时,Box2D物体以中心为旋转原点,但NinePatchDrawable.draw()默认以左下角为旋转原点,直接绘制会导致位置和旋转效果错误。之前用矩阵变换的方案虽然可行,但每次调用batch.setTransformMatrix()会触发SpriteBatch的flush操作,循环内批量绘制时会引发性能警告。

关键优化思路

利用NinePatchDrawable.draw()方法本身的originX和originY参数,直接指定旋转原点为NinePatch的中心,无需修改SpriteBatch的变换矩阵,从根源避免flush触发。

优化代码实现

正确的Brick.draw方法

NinePatchDrawable ninePatchDrawable = ...;

public void draw(SpriteBatch batch) {
    float halfWidth = widthInWorld / 2f;
    float halfHeight = heightInWorld / 2f;
    float bodyX = body.getPosition().x;
    float bodyY = body.getPosition().y;
    float rotation = body.getAngle() * MathUtils.radiansToDegrees;

    ninePatchDrawable.draw(
        batch,
        bodyX - halfWidth, // NinePatch左下角的世界坐标
        bodyY - halfHeight,
        halfWidth, // 旋转原点X:相对于左下角的偏移(宽度的一半)
        halfHeight, // 旋转原点Y:相对于左下角的偏移(高度的一半)
        widthInWorld,
        heightInWorld,
        1f,
        1f,
        rotation
    );
}

方案说明

  • 旋转原点参数originX/originY:设置为NinePatch世界宽度/高度的一半,让旋转中心与Box2D物体的中心完全对齐。
  • 绘制位置计算:bodyX - halfWidth和bodyY - halfHeight对应NinePatch左下角的世界坐标,确保物体中心与Box2D body的中心重合。
  • 避免矩阵变换:无需修改SpriteBatch的变换矩阵,不会触发flush操作,彻底解决循环内批量绘制的性能警告问题。

适配你的场景细节

结合你给出的参数:

  • 砖块NinePatch原图尺寸130×34(有效区域128×32),只需确保widthInWorld和heightInWorld对应世界空间的实际尺寸即可。
  • 已绑定FitViewport相机矩阵的SpriteBatch,直接使用该方法绘制即可保持正确的视口映射。

内容的提问来源于stack exchange,提问作者user2342558

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:30:16