Android: использование анимированного спрайта в libgdx

Продолжаю допиливать движок Bomberman. Реализовал анимацию на спрайтах.

Одним из пунктов реализации, как я в прошлой статье писал, является анимация. Собственно, сделал на базе спрайтов . Спрайтовая анимация(SpriteAnimation) – техника создания иллюзии движения с использованием статических изображений.

Анимация состоит из нескольких кадров, появляющихся в последовательности через определенные промежутки времени.

Собственно, изначально я просто картинку грузил как текстуру:

//создание текстурки
Texture texture = new Texture(Gdx.files.internal("images/Bomberman.png"));

//прорисовка
spriteBatch.draw(texture, x, y ,sizeX, sizeY);
			

В дальнейшем думал, что просто буду новую текстуру создавать с новой картинкой при движении. Но, как сами понимаете, придётся в памяти тогда несколько текстурок хранить для каждой картинки. И вот тут спрайты очень выручают. Ясно, что качественной графики на спрайтах добиться сложновато (новичку), но для Bomberman’а много и не надо. Там для движения по каждому направлению всего по 3 кадра. Как юзать спрайт в libgdx?



Texture texture;                //текстурка
TextureRegion[] textureFrames;  //массив текстур для хранения кадров по отдельности
Animation       walkAnimation;  //объект анимации

//создаётся текстура из файла
texture  = new Texture(Gdx.files.internal("images/BombermanSprite.png"));

//получаем 2-ый массив кадров из текстуры. Стоит отметить, что размеры кадров одинаковые должны быть, а то нарежет криво
TextureRegion tmp[][] = TextureRegion.split(texture, texture.getWidth() / FRAME_COLS, texture.getHeight() / FRAME_ROWS);

textureFrames = new TextureRegion[FRAME_COLS * FRAME_ROWS];
int index = 0;
for (int i = 0; i < FRAME_ROWS; i++)
  for (int j = 0; j < FRAME_COLS; j++)
    textureFrames[index++] = tmp[i][j];

//создание анимации. Первый параметр указывает на длительность каждого кадра. Второй параметр - массив кадров
walkAnimation = new Animation(SPEED, textureFrames); 

Я это всё дело запилил в конструктор модели бомбермена. И создал метод для получения текущего кадра:

public TextureRegion getCurrentFrame(){
  TextureRegion curFrame;
  if(state == State.WALKING)
  {
    curState+=0.5;
    switch(direction){
      case LEFT:
        ...
        break;
      case RIGHT: 
        ...
        break;
      case DOWN: 
        ...
        break;
      case UP: 
        ...
        break;
    }
    
    //второй параметр указывает на то, что анимация зациклена
    curFrame = walkAnimation.getKeyFrame(curState, true);
	
    return curFrame;
}

В итоге анимация движения идентична той, что была в оригинальной игре =3

  Категории: Android, java, libgdx, Игры, Коддинг
  • Pingback: Bomberman v1.1 | Suvitruf's Blog()

  • Dmitriy

    Здесь показана реализация анимации с помощью TextureRegion,но как ее реализовать если используешь TextureAtlas ??

    • http://suvitruf.ru Suvitruf

      Не работал с ним.

      Могу в какой-нибудь будущей статье рассмотреть работу с ним.