多个动画的动画偏移
Animation offset for multiple animations
我正在使用 TexturepackgerGUI
将多个动画打包到一个 spritesheet 中。我用 Spriter
生成这些动画。 TexturepackerGUI
附带了一个方便的功能,可以输出一个偏移字段,该字段可用于偏移动画,因此精灵在变大时不会从左向右移动。
但是多个动画呢?当我从我的行走动画移动到空闲或 运行 它仍然改变位置,因为这些帧使用更大的精灵,因为我在 Spriter
.
移动和旋转我的部分更多
解决此问题的一种方法是在 Spriter
中输出固定大小,但这会浪费大量纹理 space,因为我必须使用最大精灵的矩形大小。
这是我的 pack/atlas 文件的样子:
idle_cycle_heavy
rotate: false
xy: 1602, 2
size: 78, 95
orig: 124, 121
offset: 3, 20
index: 20
idle_cycle_heavy
rotate: false
xy: 1682, 2
size: 78, 95
orig: 124, 121
offset: 3, 20
index: 21
//...
run_cycle_heavy
rotate: false
xy: 162, 507
size: 78, 95
orig: 116, 113
offset: 22, 11
index: 25
run_cycle_heavy
rotate: false
xy: 1636, 406
size: 78, 97
orig: 116, 113
offset: 23, 13
index: 18
//...
而这里我是用偏移来画的
public void draw(SpriteBatch batch) {
TextureRegion currentFrame = getCurrentFrame();
if (currentFrame == null) Gdx.app.log("Unit.java", "Could not find proper frame.");
int posX = Math.round(((TextureAtlas.AtlasRegion) currentFrame).offsetX);
int posY = Math.round(((TextureAtlas.AtlasRegion) currentFrame).offsetY);
batch.draw(currentFrame, posX, posY);
}
/**
* Gets the texture region of the current frame taking the unit state into account
* @return the current TextureRegion
*/
private TextureRegion getCurrentFrame()
{
frameTime += Gdx.graphics.getDeltaTime();
if (unitState.equals(UnitState.Idle))
{
return idleAnimation.getKeyFrame(frameTime);
}
else if (unitState.equals(UnitState.Walking))
{
return walkAnimation.getKeyFrame(frameTime);
}
else if (unitState.equals(UnitState.Running))
{
return runAnimation.getKeyFrame(frameTime);
}
else if (unitState.equals(UnitState.Shooting))
{
return shootAnimation.getKeyFrame(frameTime);
}
return null;
}
我有点希望 TexturePackerGui
中有一个选项允许我根据最大的图像设置偏移量。
在 Spriter
和 TexturePacker
又一个小时的摆弄之后,我找到了解决方案。问题的核心在于Spriter
。 Spriter 可以根据当前导出的动画中最大的帧导出矩形大小的动画。可悲的是,它不能为实体的所有动画执行此操作,他们确实应该添加。
一个快速的解决方法是在导出时创建一个自定义矩形并将其变大,这样您的框架就不会被截断。然后用这个矩形大小导出每个动画。 TexturePackerGUI
可以选择 trim whitespace 并根据该数字提供偏移量。由于所有原始帧都位于初始 rectangle/image 中的正确位置,因此这解决了问题。我现在有一个紧凑的 spritesheet。
我真的很想看到 Spriter
的一项功能,它实际上可以自动执行此操作。它为当前导出的动画提供了此选项,但对于想要 export/create 多个动画的任何人来说都是无用的。 Spriter
提供的另一个选项是设置 animation export box size
,在这里您可以将其克隆到所有其他 entities/animations。这里的问题是,大多数时候你不知道最大的帧是什么,并且必须查找具有最大精灵的帧,否则较大的帧将被截断。这就是为什么我只将帧导出为 512x512 图像的原因,以确保它们都适合。如果您保留图像,这会浪费很多 space,但可以删除它们并在需要时轻松生成。
我正在使用 TexturepackgerGUI
将多个动画打包到一个 spritesheet 中。我用 Spriter
生成这些动画。 TexturepackerGUI
附带了一个方便的功能,可以输出一个偏移字段,该字段可用于偏移动画,因此精灵在变大时不会从左向右移动。
但是多个动画呢?当我从我的行走动画移动到空闲或 运行 它仍然改变位置,因为这些帧使用更大的精灵,因为我在 Spriter
.
解决此问题的一种方法是在 Spriter
中输出固定大小,但这会浪费大量纹理 space,因为我必须使用最大精灵的矩形大小。
这是我的 pack/atlas 文件的样子:
idle_cycle_heavy
rotate: false
xy: 1602, 2
size: 78, 95
orig: 124, 121
offset: 3, 20
index: 20
idle_cycle_heavy
rotate: false
xy: 1682, 2
size: 78, 95
orig: 124, 121
offset: 3, 20
index: 21
//...
run_cycle_heavy
rotate: false
xy: 162, 507
size: 78, 95
orig: 116, 113
offset: 22, 11
index: 25
run_cycle_heavy
rotate: false
xy: 1636, 406
size: 78, 97
orig: 116, 113
offset: 23, 13
index: 18
//...
而这里我是用偏移来画的
public void draw(SpriteBatch batch) {
TextureRegion currentFrame = getCurrentFrame();
if (currentFrame == null) Gdx.app.log("Unit.java", "Could not find proper frame.");
int posX = Math.round(((TextureAtlas.AtlasRegion) currentFrame).offsetX);
int posY = Math.round(((TextureAtlas.AtlasRegion) currentFrame).offsetY);
batch.draw(currentFrame, posX, posY);
}
/**
* Gets the texture region of the current frame taking the unit state into account
* @return the current TextureRegion
*/
private TextureRegion getCurrentFrame()
{
frameTime += Gdx.graphics.getDeltaTime();
if (unitState.equals(UnitState.Idle))
{
return idleAnimation.getKeyFrame(frameTime);
}
else if (unitState.equals(UnitState.Walking))
{
return walkAnimation.getKeyFrame(frameTime);
}
else if (unitState.equals(UnitState.Running))
{
return runAnimation.getKeyFrame(frameTime);
}
else if (unitState.equals(UnitState.Shooting))
{
return shootAnimation.getKeyFrame(frameTime);
}
return null;
}
我有点希望 TexturePackerGui
中有一个选项允许我根据最大的图像设置偏移量。
在 Spriter
和 TexturePacker
又一个小时的摆弄之后,我找到了解决方案。问题的核心在于Spriter
。 Spriter 可以根据当前导出的动画中最大的帧导出矩形大小的动画。可悲的是,它不能为实体的所有动画执行此操作,他们确实应该添加。
一个快速的解决方法是在导出时创建一个自定义矩形并将其变大,这样您的框架就不会被截断。然后用这个矩形大小导出每个动画。 TexturePackerGUI
可以选择 trim whitespace 并根据该数字提供偏移量。由于所有原始帧都位于初始 rectangle/image 中的正确位置,因此这解决了问题。我现在有一个紧凑的 spritesheet。
我真的很想看到 Spriter
的一项功能,它实际上可以自动执行此操作。它为当前导出的动画提供了此选项,但对于想要 export/create 多个动画的任何人来说都是无用的。 Spriter
提供的另一个选项是设置 animation export box size
,在这里您可以将其克隆到所有其他 entities/animations。这里的问题是,大多数时候你不知道最大的帧是什么,并且必须查找具有最大精灵的帧,否则较大的帧将被截断。这就是为什么我只将帧导出为 512x512 图像的原因,以确保它们都适合。如果您保留图像,这会浪费很多 space,但可以删除它们并在需要时轻松生成。