Решил всё-таки плотно заняться разработкой игр под Android. На чистом OpenGL как-то ломало всё писать, решил поискать движки готовые. Остановился на libgdx.
Просто так что-то там шаманить не особо интересно. Сразу определился, что итогом должна стать готовая игра, а именно — Bomberman. Да-да, тот самый, в который в своё время на NES рубились.
Для начала необходимо было архитектуру продумать. В этом плане помогла статья. Очень полезный туториал. Правда я не стал разграничивать на десктопную и мобильную версию. Там автор в базовый проект выносить всё логику, а в дочерних уже необходимый либы подключает в зависимости от платформы. Так как я чисто под Android пишу, то только 1 проект создал и все либы туда покидал.
Выбрал за основу этот туториал, ибо автор строит архитектуру игры на оснвое MVC паттерна. Я особо не заморачиваюсь обычно над паттернами ООП, но. если есть возможность, стараюсь использовать (: MVC няша, я все сайты всегда на его основе пишу. И тут решил его использовать. В итоге у нас есть модели — объекты (перс, npc’ы, блоки и т.д.), представление — классы, отвечающие за рендеринг, ну и контроллер, который всё связывает.
Туториал закладывает основы, допиливать вам самим всё придётся. Игра выглядит сейчас так, как на картинке сверху. Что уже реализовано:
- Карта. Реализована карта уровня, можно уже размещать объекты на ней.
- Взаимодействие с миром. Реализована возможность управления bomberman’ом. В след за движением игрока двигается и камера.
- Проверка на взаимодействие. Реализована проверка доступности пути. Игрок не может пройти сквозь непроходимые объекты.
Самая проблемная часть была с движением -.- Естественно, сначала реализовал для статичной карты. А потом, когда реализовал движение камеры, то всё с нуля делать пришлось опять 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, если вы знаете, ширина то не маленькая. Целиком всё на экране не уместить. В итоге, геймплей получился такой же как в оригинальной игре на приставке.
И самая большая проблема была при работе с координатами. Мало того, что замучался с тем, как нормально переложить координаты нажатий на экран на игровые координаты. Даже после того, как сделал, пришлось переделывать после того, как движение камеры добавил. Ну и про проверку проходимости вообще молчу -.-
В планах:
- Добавить npc и задать поведение им.
- Добавить бонусы, которые может подобрать игрок.
- Анимация/спрайты.
- Музыка.
С анимацией вообще пока никаких идей нет. А для остального данных не хватает. Если кто в курсе, помогите. Нужна инфа по уровням: количество монстров, количество бонусов, количество кирпичей на левеле. Нужна, собственно, инфа по мобам: поведение и т.д. Так же нужна музыка из игры. Я тут .nes пропарсил, но там не вся игровая музыка )=