Продолжаю допиливать движок 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