Android: знакомство с libgdx при разработке игр

Bomberman

Решил всё-таки плотно заняться разработкой игр под Android. На чистом OpenGL как-то ломало всё писать, решил поискать движки готовые. Остановился на libgdx.

Просто так что-то там шаманить не особо интересно. Сразу определился, что итогом должна стать готовая игра, а именно — Bomberman. Да-да, тот самый, в который в своё время на NES рубились.

Для начала необходимо было архитектуру продумать. В этом плане помогла статья. Очень полезный туториал. Правда я не стал разграничивать на десктопную и мобильную версию. Там автор в базовый проект выносить всё логику, а в дочерних уже необходимый либы подключает в зависимости от платформы. Так как я чисто под Android пишу, то только 1 проект создал и все либы туда покидал.

Выбрал за основу этот туториал, ибо автор строит архитектуру игры на оснвое MVC паттерна. Я особо не заморачиваюсь обычно над паттернами ООП, но. если есть возможность, стараюсь использовать (: MVC няша, я все сайты всегда на его основе пишу. И тут решил его использовать. В итоге у нас есть модели — объекты (перс, npc’ы, блоки и т.д.), представление — классы, отвечающие за рендеринг, ну и контроллер, который всё связывает.

Туториал закладывает основы, допиливать вам самим всё придётся. Игра выглядит сейчас так, как на картинке сверху. Что уже реализовано:

  1. Карта. Реализована карта уровня, можно уже размещать объекты на ней.
  2. Взаимодействие с миром. Реализована возможность управления bomberman’ом. В след за движением игрока двигается и камера.
  3. Проверка на взаимодействие. Реализована проверка доступности пути. Игрок не может пройти сквозь непроходимые объекты.

Самая проблемная часть была с движением -.- Естественно, сначала реализовал для статичной карты. А потом, когда реализовал движение камеры, то всё с нуля делать пришлось опять T___T

Парочку интересных моментов освещу и кое-какие сырки выложу. Камерой управляем с помощью OrthographicCamera. Как оказалось, с самой камерой всё просто:

//сам объект создаём
OrthographicCamera cam;
//размеры камеры
float CAMERA_WIDTH = 30f;
float CAMERA_HEIGHT = 11f;
//установка размеров
cam = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
//установка позиции
cam.position.set(x, y,0);
this.cam.update();

Как я уже сказал, всё довольно просто. А когда наш персонаж двигается, мы просто cam.position.set(x, y,0) снова вызываем и всё.

Проблема была в другом: проблема с разрешением экрана. Размеры экрана у устройств может быть разное. Во многих случаях картинка будет либо растянута, либо сжата. Но основная проблема заключается в том, что если у реального устройства соотношение сторон будет иным чем у виртуального холста, то картинка будет растягиваться/сжиматься непропорционально, т.е. будут наблюдаться неприятные искажения по ширине/длине. Для некоторых игр это не столь существенно и этим можно пренебречь ради быстроты и удобства разработки игры. Но для всех остальных игр это не приемлемо.

Я решил эту проблему тем, что скалирую всё от высоты экрана. То есть, высоту я задал сам float CAMERA_WIDTH = 30f;. А ширину вычисляю в зависимости от ширины экрана.

//получаем ширину экрана и скалируем по высоте
CAMERA_WIDTH =  CAMERA_HEIGHT*Gdx.graphics.getWidth()/Gdx.graphics.getHeight();

В общем-то всё. Кто-то советует задавать размеры статичные, а уже потом позиционировать поле игровое по центру экрана. Мне такой метод не нравится, ибо по краям много пустого пространства остаётся. Да и в bomberman, если вы знаете, ширина то не маленькая. Целиком всё на экране не уместить. В итоге, геймплей получился такой же как в оригинальной игре на приставке.

И самая большая проблема была при работе с координатами. Мало того, что замучался с тем, как нормально переложить координаты нажатий на экран на игровые координаты. Даже после того, как сделал, пришлось переделывать после того, как движение камеры добавил. Ну и про проверку проходимости вообще молчу -.-

В планах:

  1. Добавить npc и задать поведение им.
  2. Добавить бонусы, которые может подобрать игрок.
  3. Анимация/спрайты.
  4. Музыка.

С анимацией вообще пока никаких идей нет. А для остального данных не хватает. Если кто в курсе, помогите. Нужна инфа по уровням: количество монстров, количество бонусов, количество кирпичей на левеле. Нужна, собственно, инфа по мобам: поведение и т.д. Так же нужна музыка из игры. Я тут .nes пропарсил, но там не вся игровая музыка )=