2016-02-23 8 views
1

Я использую TexturepackgerGUI, чтобы упаковать несколько анимаций в спрайт. Я генерирую эти анимации с помощью 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

После очередного часа занятий с Spriter и TexturePacker Я нашел решение. Ядро проблемы находится в Spriter. Спринт может экспортировать анимацию с размером прямоугольника на основе самого большого кадра в текущей экспортируемой анимации. К сожалению, он не может сделать это для всех анимаций сущности, которые они действительно должны добавить.

Быстрое исправление заключается в создании пользовательского прямоугольника при экспорте и создании этого огромного, чтобы ваши рамки не обрезались. Затем экспортируйте каждую анимацию с этим размером прямоугольника. TexturePackerGUI имеет возможность обрезать пробелы и на основе этого номера будет обеспечивать смещение. Поскольку все исходные кадры, где в правильном месте в исходном прямоугольнике/изображении, это фиксировало проблему. Теперь у меня плотно упакованный спрайт.

Я действительно хотел бы увидеть функцию для Spriter, которая на самом деле сделает это автоматически. Он предоставляет возможность для этого в текущем экспорте анимации, но это бесполезно для всех, кто хочет экспортировать/создать несколько анимаций. Другим вариантом, который предлагает Spriter, является установка animation export box size, и здесь вы можете клонировать его ко всем другим объектам/анимации. Проблема здесь в том, что большую часть времени вы не знаете, что такое самый большой кадр, и нужно искать рамку с помощью самого большого спрайта, иначе большие кадры будут обрезаны. Вот почему я только что экспортировал свои кадры в виде изображений размером 512x512, поэтому я убедился, что все они подходят. Это избавляет от лишнего пространства, если вы сохраняете изображения, но их можно удалить и легко сгенерировать при необходимости снова.