Доработал слегка управление, слегка анимацию оптимизировал. Контролы будут снизу справа (установка бомбы, взрыв и т.д). Для управления пока тачем. Если нажали левее перса, то идёт влево, если выше, то вверх и т.д. Если есть клава, то двигаться можно стрелками, а бомбу устанавливать пробелом.
Я уже писал про использование спрайтов. Реализовывал я анимацию внутри самих объектов. То есть, в итоге в каждом объекте был объект Animation
, который грузил игру. Я как-то не особо сначала понял принцип работы, поэтому допустил такую ошибку. Как оказалось, анимацию то можно повесить одну всего, а в конкретных объектах менять лишь переменную состояния.
В классе, отвечающем за рендеринг создал массив анимаций различных объектов
public Map<String, Animation> animations = new HashMap<String, Animation>(); }
Затем надо лишь 1 экземпляр Animation
для каждого объекта создать. Как пример, для npc Baloom:
private void loadBaloomAnimation(){ Texture texture = new Texture(Gdx.files.internal("images/BalloomSprite.png")); TextureRegion tmp[][] = TextureRegion.split(texture, texture.getWidth() / Balloom.FRAME_COLS, texture.getHeight() / Balloom.FRAME_ROWS); TextureRegion[] textureFrames = new TextureRegion[Balloom.FRAME_COLS * Balloom.FRAME_ROWS]; int index = 0; for (int i = 0; i < Balloom.FRAME_ROWS; i++) for (int j = 0; j < Balloom.FRAME_COLS; j++) textureFrames[index++] = tmp[i][j]; animations.put(Balloom.Name, new Animation(2* Balloom.SPEED, textureFrames)); }
При рендеринге нам нужно лишь теперь получить номер фрейма.
private void drawNpcs() { for(NpcBase npc : world.getNpcs()){ spriteBatch.draw(animations.get(npc.getName()).getKeyFrame( npc.getAnimationState(), true), (npc.getPosition().x - cam.position.x+CAMERA_WIDTH/2)* ppuX, npc.getPosition().y * ppuY, NpcBase.SIZE * ppuX, NpcBase.SIZE * ppuY); } }
Самое главное тут — вызов метода npc.getAnimationState()
у npc. Для всё того же Balloom он такой:
public float getAnimationState(){ animationState+=0.5; switch(state){ case NONE: if(direction == Direction.LEFT) if(animationState>10) animationState = 0; else ... break; case DYING: ... break; } return animationState; }
Если раньше для каждого объекта создавался объект анимации (то есть, если 3 врага, то 3 объекта…20 кирпичей, 20 анимаций -.-), то теперь всего 1 объект анимации для Balloom , 1 объект анимации для кирпичика.
По поводу управления. Как уже сказал, для установки бомбы надо нажать справа снизу. Движение всё так же по тачу в зависимости от положения клика относительно персонажа. Если есть клавиатура, то можно на стрелках двигаться, а пробелом ставить бомбу. В планах сделать виртуальные стрелки слева снизу…на планшетах удобно, чтоб было)
Ну и по мелочи стараюсь оптимизировать. Надо бы с музыкой что-то придумать, а то 50% веса игры — музыка =D
Сейчас в планах сделать анимацию для взрыва. Одним объектом и спрайтом не получится…думаю над реализацией)
Если кто-то хочет помочь с тестированием, можете скачать Bomberman v1.1.