Дипломная (вкр): Разработка игрового мобильного приложения на Android

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Первый - Unity 2D [6].

Рисунок 1.16 - Логотип движка Unity

Юнити на сегодняшний момент является одним из самых перспективных и мощных инструментов для создания игр на различные игровые платформы. Убедиться в этом мы могли хотя-бы в том, что один из 4х игровых проектов (которые я рассматривал), оказался сделан именно на этом движке. Юнити позволяет сделать потрясающую графику, освещение без особых усилий от самого разработчика. Сама платформа вмещает в себя множество инструментов для создания различных игровых сцен.

Юнити обладает очень высокой кроссплатформенностью. Он позволяет создавать игры не только на PC, но и на все существующие популярные мобильные платформы. Многие создатели игр выбирают данный движок для того, чтобы реализовать на нем игровые проекты. Юнити хорош тем, что часть сложных компонентов в нём уже готова. Разработчику не требуется ничего придумывать, а только научиться применять готовые инструменты.

Второй движок, который я рассматривал называется Marmalade SDK [2].

Рисунок 1.17 - Логотип движка Marmalde SDK

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

Движок написан на С++. По размеру он практически сравним с юнити. В Мармелад входят компоненты для создания целых 2х версий проектов. Можно делать мощные проекты на С++, а можно сделать на Lua-версии движка более простые проекты. Приложения в нём собирать действительно легко и удобно. Имеется симулятор, в котором можно тестировать свои наработки максимально близко.

Сравнив плюсы и минусы первого и второго движка, я всё-же решил выбрать Мармелад. Игровых проектов, сделанных на нём, не так много. Обосную своё решение тем, что в Мармеладе мне удалось намного быстрее добиться первых результатов и запуске на своём смартфоне тестовых приложений. На освоение всех методов движка у меня ушло 2-3 дня, когда с Юнити за такое-же время я разбирался с одним из его компонентов. В основе Мармелада есть и возможность подклюать физику, благодаря встроенному Cocos-2D, которые позволяет моделировать в игре различные физически ситуации. Столкновения и остальное. (правда для моего проекта это не применимо).

Также я выбрал Мармелад потому, что в его быстрой версии используется знакомый мне язык программирования Lua [4], который считается скриптовым, однако на самом деле является очень мощным и гибким средством для разработки, основным преимуществом которого является особый тип данных - таблиц и фантастическая производительность в расчётах.

        

         2. СТРУКТУРА ПРИЛОЖЕНИЯ

        

         2.1 Структура Android-приложений


Рассмотрим изначально основную структуру любого Андроид-приложения.приложения могут отличаться по сложности, но их основное строение всегда будет одинаковым. Есть обязательные элементы приложений, без которых приложения как такового не может быть, а есть дополнительные, которые называют опциональными, которые используются только по мере необходимости разработчиками и отвечают за определённые настройки. Android-приложение состоит в основном из нескольких основных компонентов: манифест приложения (в котором находится вся информация о программе), набор различных материалов и компонентов, которые использованы в его создании и исходный код программы.

Следующая таблица демонстрирует обязательные и возможные составляющие структуры Android-приложения:

Таблица 1 - Составляющие структуры Android - приложения

Название

Описание

Необходимость

gen

Файлы, сгенерированные самой Java. Здесь находится такой важный файл как R.java

Да

AndroidManifest.xml

Файл манифеста AndroidManifest.xml предоставляет системе основную информацию о программе. Каждое приложение должно иметь свой файл манифеста

Да

src

Каталог, в котором содержится исходный код приложения

Да

assets

Произвольное собрание каталогов и файлов

Нет

res

Каталог, содержащий ресурсы приложения. В данном каталоге могут находиться подпапки drawable, anim, layout, menu, values, xml и raw (см. ниже)

Да


После того, как мы рассмотрели кратко структуру определённого приложения, сразу перейдём к игровому движку.

         2.2 Особенности игрового движка


Основной особенностью движка являются игровые сцены (экраны). В конкретный момент времени может быть видна только одна единственная сцена со всеми игровыми событиями, которые к ней подключены.

В игровом приложении изначально есть основной файл main.lua, из которого в дальнейшем можно будет вызывать и добавлять переходы к любым кусочкам и сценам вашего приложения. При создании проекта автоматически создаются все каталоги и папки, необходимые для элементарной его работы.

Для того, чтобы систематизировать игровые файлы, рекомендуется создать папку resourses (ресурсы) куда будут добавляться разные игровые картинки, музыка и анимации, а основные файлы сцен, в которых находится описание других элементов рекомендуют создавать всегда отдельно и называть максимально понятно, именем того, за что оно отвечает.

В основном мой игровой проект будет включать в себя картинки разных форматов и множество написанных на языке Lua-скриптов, в которых будет описана логика и определённые игровые сцены.Для освоения данного языка была подробно изучена его документация [5].

Сам движок представляет из себя огромное множество написанных на этом-же языке компонентов. Подробная документация по движку [1]. Например, режиссёр. Роль которого в проекте является очень важной. По английски он назывется director. Директор является одним из базовых классов, который иммитировали на языке Lua, за счёт чего он очень напоминает объектно-ориентированное программирование. Это позволяет программистам получить более читаемый и понятный логически код. Например, команда...:createSprite(director.displayCenterX, director.displayWidth, "textures/tower.png")

Вызывает изначально класс режиссёра игровых сцен, а потом команду создания изображения по координатам центра экрана с картинкой, которая находится в каталоге текстуры (textures) c названием «tower» формата .png. Такая структура всех основных готовых игровых библиотек позволяет им упростить не только обращение к ним, но и сделать его очень удобным для использования и применения в достижении своих целей.

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

Таких модулей, которые добавляет движок в наше приложение действительно огромное множество. Есть модули, связанные с физикой. Есть модули, которые двигают спрайты в любые точки на экране. Рассказывать о них можно действительно много, однако давайте поговорим немного о программной части.

Разные скрипты в программе и функции из других файлов можно будет вызывать друг из друга, если написать в них команду

require("newfile"), где newfile - название.

После того, как мы это сделаем. У нас будет возможность подключать в любые сцены любые нужные файлы, после чего использовать и их методы. Допустим, что мы построим в отдельном файле метод рисовки игрового экрана (сетку). Изначально она будет пуста. Нам нужно будет или сделать в ней методы добавления изображений, или дописать отдельный класс, который будет содержать команды добавления или удаления таких файлов.

Для того, чтобы затем использовать функции сетки мы должны будем её объявить в нужной нам сцене способом, который показан выше.

При переключении игровых экранов используется метод switchscene, который позволяет сменить текущее изображение на любое другое, при этом отводя картинку в сторону.

Дополнительно в каталоге проекта движка, есть ещё несколько файлов app, common. Development. Они позволяют настроить движок. Например, отключить в игре использование альбомной ориентации. Ведь игра при том, когда переворачиваешь экран автоматически перемещает её в нужную сторону. Специальные команды в этих файлах помогают отключить это. Также там можно настроить максимально возможную громкость вашего приложения и многое-многое другое. Оптимальные же данные уже изначально введены в эти файлы. Также в них можно переписать главный файл приложения с main.lua, на любой другой, который вам захочется. И при запуске игры она будет загружаться именно с него.

Давайте немного рассмотрим интерфейс самого движка.

android приложение программа тестирование

Рисунок 2.1 - Менеджер проектов Marmalade SDK

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

Рисунок 2.2 - Внешнее окно управления проектом

Внизу находится клавиша Open in IDE, которая открывает проект как структуру. С кучей файлов, папок, скриптов, игровых материалов и остального. Там мы и будем проводить основную часть создания своего приложения.

Рисунок 2.3 - Среда создания игрового приложения

Здесь мы можем в любой момент создавать необходимые нам файлы, или добавлять их сразу прямо в папку с проектом для дальнейшего использования. Вверху находится кнопка (Play), которая позволяет нам собрать текущий проект. Запустить и отладить его. При этом в консоль внизу будет выводится различная отладочная информация (которую мы выводим для тестов).

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

Итоговая структура приложения в движке будет представлять из себя множество отобранных для игры ресурсов, звуком, изображений на задний план в игровых сценах, и конечно-же множество .lua скриптов, в которых будут описаны различные классы, игровые сцены и всё остальное. Обязательно будет главная сцена с которой будет осуществляться первый переход скажем в «главное меню» будущего проекта.

        

         3. Алгоритмизация и программирование

        

         3.1 Разработка алгоритма


Как уже говорилось ранее, наша игра разделяется на множество сцен. В итоговом варианте своего приложения я насчитывал всего 3 самых необходимых сцены, без которых игре невозможно было бы обойтись. Этими сценами являлись главное меню игры, экран выбора уровней и сам экран, который мы видим в процессе самой игры, на котором игрок совершает какие-любо действия. Упрощённая блок-схема взаимосвязи игровых сцен представлена в Приложении 2.

Первым делом в своём приложении, ещё до его создания, мне нужно было заранее решить проблему хранения игровых данных. Движок Marmalade сделан действительно качественно, поэтому сразу предложил мне возможность подключения небольшой базы данных на языке SQLite 3 [3], которая помогла бы мне разобраться с этой проблемой. Виртуальными командами были сделаны 2 простых таблицы.

Команда для создания таблицы с количеством наших монет (на будущие игровые бонусы они будут расходоваться).

CREATE TABLE monets(name TEXT, value INTEGER);INTO monets VALUES("money_1", 0);

Изначальное количество монет у игрока равняется 0.

Команда для создания таблицы, которая хранит результаты прохождения игровых уровней.

CREATE TABLE levels(name NAME, status BOOLEAN);INTO levels VALUES("level_1", 1);INTO levels VALUES("level_2", 0);

…INTO levels VALUES("level_30", 0);

Статус уровней 0 - закрыт, 1 - открыт и можно играть. По умолчанию при первом запуске игры будут закрыты все уровни, кроме 1.

При первом запуске игры, если файл сохранения игровых данных в игре отсутствует - она автоматически создаёт его. В дальнейшем же, если файл есть, игра просто запускается, считывая ваши результаты.

Были заранее созданы функции, которые помогают получить или изменить количество монет у игрока, проверить открыт тот или иной уровень и всё остальное. В целом, подключение к базе данных не является постоянным и выглядит примерно вот так.

Рисунок 3.1 - Взаимодействие с базой данных

Мы в любой момент запрашиваем данные из отдельных таблиц хранилища, вызывая специальную функцию из файла database.lua, где уже описаны все основные команды, которые могут нам пригодится в игре. Открываем подключение к хранилищу игровых данных, выполняем определённые команды, представленные в виде запроса на языке sql, после этого работаем с результатом, получаем из него нужную нам информацию и обычно возвращаем нам назад уже конкретное число.

Допустим, мы проверяем открыт ли у нас 30-й уровень в игре. Для этого мы вызываем функцию check_level_status(level_num), где level_num - номер нашего игрового уровня (т.е. 30). В результате этой функции мы получим число 0 или 1, которое говорит нам о том, открыт или закрыт данный уровень. Внутри функции будет сформирован специальный SQL-запрос по нашим требованиям, по которому мы уже получим конкретный результат.

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

В дальнейшей разработке нашего приложения, была создана примерно такая последовательность, в порядке которой создавалась игра.

. Создание сцены главного меню приложения

.1 Добавление кнопки «играть» и кнопки «выход».

.2 Создание изображения с названием игры.

.3 Рисование мельниц и добавления к ним анимации

.4 Создание движущихся облаков

. Создание сцены экрана выбора уровней

.1 Создание категорий уровней

.2 Открытие уровней в любой из 6 категорий

.3 Рисование графики доступности уровней

.4 Проверка доступности уровней из игрового хранилища

.5 Вывод количества монет на экран

.6 Кнопка «вернутся в меню»

.7 Запуск определённого уровня любой категории (если он открыт)

. Создание сцены игрового экрана

.1 Создание графического представления отдельных элементов

.2 Создание класса игрового объекта, игровой сетки

.3 Создание основного алгоритма игры три в ряд в классе игровой сетки

.4 Создание дополнительных классов селектора и взрывателя

.5 Загрузка игровой цели в зависимости от выбранного уровня

.6 Загрузка количества монет и проверка доступности бонусов

Источник: https://www.bibliofond.ru/detail.aspx?id=897395