2016-02-23 108 views
1

我使用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一個選項,允許我設置基於最大的圖像偏移。

回答

1

經過又一小時擺弄SpriterTexturePacker我找到了一個解決方案。問題的核心在於Spriter。 Spriter能夠根據當前導出的動畫中的最大幀,導出一個矩形大小的動畫。可悲的是,它不能爲一個實體的所有動畫做到這一點,他們實際上應該添加這些動畫。

一個快速解決方案是在導出時創建一個自定義矩形,並使其成爲一個巨大的框架,因此您的框架不會被切斷。然後用這個矩形大小導出每個動畫。 TexturePackerGUI可以選擇修剪空白,並根據該數字提供偏移量。由於原始矩形/圖像中正確位置的所有原始幀都解決了這個問題。我現在有一個緊湊的spritesheet。

我真的很想看到Spriter的功能,它實際上會自動執行此操作。它爲當前正在導出的動畫提供了這個選項,但對於任何想要導出/創建多個動畫的人來說都沒有用。 Spriter提供的另一個選項是設置animation export box size,在這裏您可以將其克隆到所有其他實體/動畫。這裏的問題是,大多數時候你不知道最大的幀是什麼,並且必須查找具有最大精靈的幀,否則較大的幀將被截斷。這就是爲什麼我只是將我的框架導出爲512x512圖像,所以我確保它們都合適。如果您保留圖像,這會浪費很多空間,但可以在需要時將其刪除並輕鬆生成。