Libgdx 使用 TextureAtlas 图像的动画旋转不正确
Libgdx Animation using images from TextureAtlas gets incorrectly rotated
在我的 TextureAtlas
中,我的 Animation
的 Sprite
旋转了 90 度。
当我画 Animation
时,它仍然旋转了 90 度。我该如何解决?
我的代码是这样的:
TextureAtlas spritesheet = new TextureAtlas(Gdx.files.internal("images/spritesheet/spritesheet.atlas"));
Array<AtlasRegion> CLOUD_ANIMATION_REGIONS = spritesheet.findRegions("cloud_animation");
Animation animation = new Animation(0.1f,ImageProvider.CLOUD_ANIMATION_REGIONS);
在渲染方法中:
batch.draw(animation.getKeyFrame(elapsedTime, true), x, y);
动画效果非常好,但像在 spritesheet 中一样旋转了 90 度。
我意识到,如果我有一个 Sprite
,我可以调用 Sprite.draw(batch)
,它会修复旋转,但我似乎无法将该机制用于 Animation
的?
编辑:
正如 Alexander 所说,这可以解决问题:
batch.draw(textureRegion, x, y, 0, 0,textureRegion.getRegionWidth(), textureRegion.getRegionHeight(), 1, 1, 90);
好的,这是未经测试的代码:
TextureRegion textureRegion = animation.getKeyFrame(elapsedTime, true);
if (textureRegion instanceof TextureAtlas.AtlasRegion && ((TextureAtlas.AtlasRegion) textureRegion).rotate)
{
batch.draw(textureRegion, x, y, 0, 0, textureRegion.getRegionWidth(), textureRegion.getRegionHeight(), 1, 1, 90, true);
}
else
{
batch.draw(textureRegion, x, y);
}
我在这里做什么:我检查 atlas packer 是否将该区域标记为旋转,然后将其绘制为顺时针旋转 90 度以补偿原始逆时针旋转 90 度。看到可以旋转TextureRegion的AtlasRegion's javadoc and special version of draw method。
已编辑:根据 Markus 评论修复参数
我认为您应该以某种方式使用 AtlasSprite。这在其构造函数中执行了 unrotate。你不想旋转每一帧——那是一些开销。 AtlasSprite 还应该处理图集中的修剪区域:这对于最大化单个图集纹理非常重要。唉,它似乎不太容易使用,因为它似乎需要为每一帧单独的精灵,这似乎是巨大的开销。
在我的 TextureAtlas
中,我的 Animation
的 Sprite
旋转了 90 度。
当我画 Animation
时,它仍然旋转了 90 度。我该如何解决?
我的代码是这样的:
TextureAtlas spritesheet = new TextureAtlas(Gdx.files.internal("images/spritesheet/spritesheet.atlas"));
Array<AtlasRegion> CLOUD_ANIMATION_REGIONS = spritesheet.findRegions("cloud_animation");
Animation animation = new Animation(0.1f,ImageProvider.CLOUD_ANIMATION_REGIONS);
在渲染方法中:
batch.draw(animation.getKeyFrame(elapsedTime, true), x, y);
动画效果非常好,但像在 spritesheet 中一样旋转了 90 度。
我意识到,如果我有一个 Sprite
,我可以调用 Sprite.draw(batch)
,它会修复旋转,但我似乎无法将该机制用于 Animation
的?
编辑:
正如 Alexander 所说,这可以解决问题:
batch.draw(textureRegion, x, y, 0, 0,textureRegion.getRegionWidth(), textureRegion.getRegionHeight(), 1, 1, 90);
好的,这是未经测试的代码:
TextureRegion textureRegion = animation.getKeyFrame(elapsedTime, true);
if (textureRegion instanceof TextureAtlas.AtlasRegion && ((TextureAtlas.AtlasRegion) textureRegion).rotate)
{
batch.draw(textureRegion, x, y, 0, 0, textureRegion.getRegionWidth(), textureRegion.getRegionHeight(), 1, 1, 90, true);
}
else
{
batch.draw(textureRegion, x, y);
}
我在这里做什么:我检查 atlas packer 是否将该区域标记为旋转,然后将其绘制为顺时针旋转 90 度以补偿原始逆时针旋转 90 度。看到可以旋转TextureRegion的AtlasRegion's javadoc and special version of draw method。
已编辑:根据 Markus 评论修复参数
我认为您应该以某种方式使用 AtlasSprite。这在其构造函数中执行了 unrotate。你不想旋转每一帧——那是一些开销。 AtlasSprite 还应该处理图集中的修剪区域:这对于最大化单个图集纹理非常重要。唉,它似乎不太容易使用,因为它似乎需要为每一帧单独的精灵,这似乎是巨大的开销。