Я использую 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
, что позволяет мне установить смещение на основе наибольшего изображения.