Bomberman v1.1

Доработал слегка управление, слегка анимацию оптимизировал. Контролы будут снизу справа (установка бомбы, взрыв и т.д). Для управления пока тачем. Если нажали левее перса, то идёт влево, если выше, то вверх и т.д. Если есть клава, то двигаться можно стрелками, а бомбу устанавливать пробелом.

Я уже писал про использование спрайтов. Реализовывал я анимацию внутри самих объектов. То есть, в итоге в каждом объекте был объект 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.

  Категории: Android, java, libgdx, Коддинг