我使用TexturepackgerGUI
將多個動畫打包成一個spritesheet。我使用Spriter
生成了這些動畫。 TexturepackerGUI
帶有一個方便的功能,可以輸出一個偏移量字段,用於偏移動畫,以便精靈在較大時不會從左向右移動。多個動畫的動畫偏移
但是多重動畫呢?當我從步行動畫移動到空閒或運行時,它仍然位移,因爲這些幀使用更大的精靈,因爲我在Spriter
中移動和旋轉了更多的部分。
解決此問題的一種方法是在Spriter
中輸出固定大小,但這會浪費大量紋理空間,因爲我必須使用最大精靈的矩形大小。
這是我包/阿特拉斯文件的外觀:
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
一個選項,允許我設置基於最大的圖像偏移。