libGDX. Урок 6. Новая игра

Мы уже изучили с вами некоторый функционал, которым обладает libGDX для создания приложения на Android. Для получения новых знаний потребуется создать игру другого формата – Whack A Zombie. Цель игры состоит в том, чтобы ударить как можно больше зомби. Зомби поднимаются/опускаются из отверстий в земле, а игроку нужно будет их касанием ударить. Игрок получает очки за битых зомби, количество очков отображается на экране.

 
В состав этих уроков будут входить следующие темы:

  • Создание начального экрана;
  • Добавление цвета;
  • Анимация зомби;
  • Добавим немного случайности (random);
  • Сохранение очков;
  • Добавление звука.

Создаем начальный экран

Начнем с реализации основного игрового экрана и отобразим зомби.

Реализуем класс Zombie.

Для начала необходимо сгенерировать новый libGDX проект, как показано на скриншоте внизу:

libGDX project

После чего нужно нажать кнопку Generate. Как только проект будет сгенерирован, откройте его через Android Studio:

open project android studio

open new libgdx project

Теперь реализуем наш первый игровой объект – зомби. Для удобства создадим новый пакет с именем gameobjects внутри нашего основного – com.gdx.whackazombie. Для этого нужно по папке com.gdx.whackazombie сделать клик правой кнопкой мыши и из выпадающего меню выбрать New – Package:

create new package android studio

А внутри пакета gameobjects создадим новый java класс – Zombie. Для этого кликайте по папке gameobjects правой кнопкой мыши и выберите New – Java class:

create new java class android studio

В итоге должно получится нечто похожее на скриншот внизу:

create new package and java class android studio

Напишите следующий код в этот класс:

package com.gdx.whackazombie.gameobjects;

import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.Vector2;


public class Zombie {

    public Sprite zombieSprite; // спрайт для отображения зомби
    public Vector2 position = new Vector2();// позиция зомби
    public float height,width; // размеры зомби

    public void render(SpriteBatch batch){

        zombieSprite.draw(batch);
    }

}

Этот класс устанавливает (спрайт, позиция, размеры, отображение…) нашего зомби. Этот код будет увеличиваться в размерах постепенно с тем как будем расширять возможности нашей игры.

 

Реализация класса GameManager

Теперь создайте новый пакет с именем managers внутри нашего основного – com.gdx.whackazombie. А внутри пакета managers создадим новый java класс – GameManager. Введите следующий код в этот файл:

package com.gdx.whackazombie.managers;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.Sprite;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.utils.Array;
import com.gdx.whackazombie.gameobjects.Zombie;

public class GameManager {

    static Array<Zombie>zombies; // массив наших зомби
    static Texture zombieTexture; // текстурное изображение нашего зомби
    private static float ZOMBIE_RESIZE_FACTOR = 500f;
    private static float ZOMBIE_VERT_POSITION_FACTOR = 3f;
    private static float ZOMBIE1_HORIZ_POSITION_FACTOR = 5.8f;
    private static float ZOMBIE2_HORIZ_POSITION_FACTOR = 2.4f;
    private static float ZOMBIE3_HORIZ_POSITION_FACTOR = 1.5f;

    public static void initialize(float width,float height){

        zombies = new Array<Zombie>();
        zombieTexture = new Texture(Gdx.files.internal("zombie.png"));

        // создание новых зомби и добавление их в массив
        for(int i=0;i<3;i++){
            zombies.add(new Zombie());
        }

        // установить позиции для каждого зомби
        zombies.get(0).position.set(width/ZOMBIE1_HORIZ_POSITION_FACTOR,height/ZOMBIE_VERT_POSITION_FACTOR);
        zombies.get(1).position.set(width/ZOMBIE2_HORIZ_POSITION_FACTOR,height/ZOMBIE_VERT_POSITION_FACTOR);
        zombies.get(2).position.set(width/ZOMBIE3_HORIZ_POSITION_FACTOR,height/ZOMBIE_VERT_POSITION_FACTOR);
        for(Zombie zombie : zombies){

            // установить спрайт для зомби, используя текстуру
            zombie.zombieSprite = new Sprite(zombieTexture);
            // установка размеров зомби
            zombie.width = zombie.zombieSprite.getWidth()* (width/ZOMBIE_RESIZE_FACTOR);
            zombie.height = zombie.zombieSprite.getHeight()* (width/ZOMBIE_RESIZE_FACTOR);
            zombie.zombieSprite.setSize(zombie.width, zombie.height);
            zombie.zombieSprite.setPosition(zombie.position.x, zombie.position.y);
        }

    }

    public static void renderGame(SpriteBatch batch){
    // Нарисовать(отобразить) каждого зомби
        //
        for(Zombie zombie : zombies)
            zombie.render(batch);
    }

    public static void dispose() {
    // утилизация текстуры крота, чтобы обеспечить отсутствие утечек памяти
        zombieTexture.dispose();
    }

}

Все основные моменты подписаны комментариями и в прошлых libGDX уроках были объяснены подробнее. Если вопросы будут, оставляйте их в комментариях – будем разбираться вместе. Здесь мы создаем три экземпляра зомби, инициализируем их, отображаем их, и в конце мы избавляемся от используемой текстуры.

Реализация класса WhackAZombie и добавление файлов в проект

Отредактируйте файл WhackAZombie согласно коду ниже (или можете полностью заменить его кодом ниже):

package com.gdx.whackazombie;

import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.gdx.whackazombie.managers.GameManager;

public class WhackAZombie extends ApplicationAdapter {

   SpriteBatch batch; // spritebatch ("пачка спрайтов") для отрисовки
   OrthographicCamera camera;

   @Override
   public void create () {

      // получаем размеры экрана нашего устройтсва
      float height= Gdx.graphics.getHeight();
      float width = Gdx.graphics.getWidth();
      // устанавливаем размеры экрана устройства в качестве размеров области просмотра игры
      camera = new OrthographicCamera(width,height);
      camera.setToOrtho(false); // центруем камеру (w/2, h/2) этой строкой
      batch = new SpriteBatch();
      GameManager.initialize(width, height);//инициализируем игру
   }

   @Override
   public void dispose() {
      super.dispose();
      //утилизация SpriteBatch и текстур
      batch.dispose();
      GameManager.dispose();
   }

   @Override
   public void render () {
      // Очищаем экран
      Gdx.gl.glClearColor(1, 1, 1, 1);
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
      // передаём вид с "камеры" в наш spritebatch
      batch.setProjectionMatrix(camera.combined);
      // отрисовка игровых объектов
      batch.begin();
      GameManager.renderGame(batch);
      batch.end();
   }

}

Этот класс также похож на то, что мы проделывали с вами на прошлых уроках в игре с дверьми. Если вы сейчас попробуете запустить приложение на своём устройстве или в эмуляторе, то получите ошибку ввиду отсутствия изображения зомби. Все файлы проекта (как и код каждого класса), которые нам понадобятся в данной игре вы можете скачать внизу урока. После скачивания добавьте их в папку android/assets вашего проекта:

add new files in assets folder android studio

 
Теперь же запустив ваш проект на Android устройстве или эмуляторе у вас должно получится это:

new libGDX game in android studio

Скачать исходники