Uploaded by nalchanzhi

bibliofond.ru 897395

advertisement
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
. АНАЛИТИЧЕСКИЙ ОБЗОР
.1 Обзор и анализ существующих приложений
.1.1 Выбор приложений
.1.2 Обзор игры Bird Paradise
1.1.3 Обзор игры Magic Blender
.1.4 Обзор игры Ice Age: Arctic Blast
1.1.5 Обзор игры Ice Crush
.2 Формирование требований
.3 Выбор варианта решения
. СТРУКТУРА ПРИЛОЖЕНИЯ
.1 Структура Android-приложений
.2 Особенности игрового движка
. Алгоритмизация и программирование
.1 Разработка алгоритма
.2 Программирование
.3 Список игровых состояний
.4 Разработка интерфейса
. Настройка, отладка и тестирование
.1 Тестирование сохранения данных
.2 Модульное тестирование
.3 Функциональное тестирование
.4 Тестирование инсталляции и отображения элементов
. Разработка руководства пользователя
.1 Общее описание
.2 Описание игровых сцен
.3 Описание игровых правил
.4 Пояснения по техническим вопросам
ЗАКЛЮЧЕНИЕ
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ 1
ПРИЛОЖЕНИЕ 2
ВВЕДЕНИЕ
В наше текущее время информационные технологии и техника
развиваются очень стремительными темпами. Не так давно в мире появились
смартфоны - улучшенные версии обычных телефонов, в которых нашлось
множество новых возможностей и функций, которые сегодня уже стали
неотъемлимой частью нашей жизни. Ежедневно в настоящее время для
смартфонов разрабатываются различные приложения самых разных характеров
от простых редакторов текста до уникальных красочных масштабных игровых
проектов. В данный момент смартфоны, как и различное программное
обеспечение дня них, являются очень востребованными в современном
обществе. Разные приложения помогают нам быть на связи с близкими,
просматривать видео и просто интересно проводить время.
В современной жизни часто бывает, что человек вынужден ехать в
автобусе или стоять в очереди, где ему попросту нечем заняться. Заметив, что в
жизни таких моментов немало - я решил сделать небольшое простое игровое
приложение на смартфоны, которое поможет немного скрасить ожидание
некоторым людям. Так, как часто человек нуждается в отдыхе, моё приложение
не будет сложным и будет максимально лёгким для освоения. Дополнительно
упростить эту задачу помогает и выбранный жанр игры. Все уже играли или
хотя-бы имеют представления о казуальных играх в жанре «три в ряд».
Целью
моей
ВКР
является
создание
качественного
небольшого
приложения на платформу Android, которое будет исправно работать и
интерфейс которого будет точно откликаться на нужные действия пользователя,
например на выбор конкретного игрового элемента и на дальнейший сдвиг его в
сторону, которую выбрал пользователь.
В задачи исследования входит изучение любых материалов, необходимых
для создания своего приложения. Необходимо изучить структуру движка,
который будет использоваться при создании данного проекта, а также изучить
основные его возможности и функции, которые помогут нам в процессе
разработки отдельных игровых компонентов. Также в задачи исследования
входит получение целостного представления о работе движка и получении
информации о том, как связывать отдельные компоненты с основной игровой
сценой приложения.
Объектом исследования является игровой движок Marmalade SDK, а
предметом исследования будет разработка игры «три в ряд» на данном движке,
в процессе которой мы изучим те функции движка, которые помогут нам в
создании своего приложения.
Практическая значимость моей исследовательской работы заключается в
том, что результаты исследования могут быть использованы в реализации
аналогичных приложений на различных движках и платформах.
1. АНАЛИТИЧЕСКИЙ ОБЗОР
1.1 ОБЗОР И АНАЛИЗ СУЩЕСТВУЮЩИХ ПРИЛОЖЕНИЙ
1.1.1 ВЫБОР ПРИЛОЖЕНИЙ
Существует огромное множество различных приложений на Android,
поэтому найти нужные нам аналоги не составит труда. Несмотря на большое
количество приложений в жанре «три в ряд» на текущем рынке, настоящую
популярность и известность получают только единицы. Давайте попробуем
рассмотреть несколько ярких игровых примеров - достижений в своём жанре и
найти в них те черты и качества, которые делают их проекты по-настоящему
уникальными, притягивающими и интересными.
Все проекты, которые мы рассмотрим в обзоре, будут успешными играми
жанра «три в ряд». Общее количество скачиваний которых на момент
написания превышает 400-500 тысяч.
1.1.2 ОБЗОР ИГРЫ BIRD PARADISE
Требования игры: ОС: Android 2.3
Жанр: Аркада
Метки: Три в ряд, игра без кешаParadise является совсем недавним
проектом от студии Ezjoy, которая уже раньше выпускала другие игры на
Android самых разных жанров. Стоит отметить, что не так давно эта компания
создала такой неоспоримый хит как Garden Mania, который получил самые
положительные и восторженные отзывы от большинства игроков. Спустя
небольшое время все фанаты узнали, что студия не собирается останавливаться
на достигнутом, а планирует добиться небывалых высот в создании игр
избранных студией жанров. Предыдущий опыт создания игр очень помог
компании не только в скорости разработки нового проекта, но и в улучшении
его сильных качеств и сторон. В новой игре Ezjoy предлагают нам взять под
свою защиту забавных птиц и помочь им защитить своё потомство от коварных
ласк. Стоит заметить, что в плане основной игровой механики не произошло
никаких
серьёзных
изменений.
Мы
так-же
должны
объединять
птиц
одинакового цвета в цепочки по три и больше элементов, чтобы очистить от них
игровой экран, набрать очки и заработать различные бонусы. Однако,
успешность этой игры кроется далеко не в обычности её игровой механики а в
том, с каким подходом и любовью разработчики создают и рисуют эту игру. В
наше время эта компания является не меньше, чем мастерами в разработке игр
данного жанра. Но как уже говорилось студия Ezjoy не планирует
останавливаться. Она постоянно совершенствует свои игровые проекты, чтобы
сделать их ещё красочнее и успешнее на рынке. Отличительной чертой данной
игры является её удивительная, красивая графика. Также в игре присутствует
большое количество красочной анимации и различных эффектов. Нельзя не
отметить, что в данной игре имеется и большой выбор уровней, доступных для
прохождения игроку, множество различных бонусов, элементов развития и
других мелочей. Bird Paradise однозначно должна понравится большинству
игроков, которым приходятся по-вкусу аркадные головоломки.
Давайте рассмотрим эту игру подробнее и естественно оценим на
практике сочетание всех игровых элементов, и попробуем зацепиться за
определённые особенности игры. Для этого я скачал из Google Play 1.3.6 версию
игры, которая на данный момент является последней.
Рисунок 1.1 - главное меню Bird Paradise
Рисунок 1.2 - экран завершения уровня Bird Paradise
Первое, на что что хотелось бы обратить внимание - это логотип
компании. Он соответствует визуальному стилю, который используется в самой
игре.
Графика в игре действительно замечательная и не зря людям нравится то,
как эта игра выглядит на экранах их смартфонов. Игра с первых секунд
запустилась легко, целостность картинки хорошо ощущается в любых её
элементах и сразу становится заметно, что и сама тематика игры выбрана
весьма здорово и подходит для этого жанра. Птицы нарисованы и анимированы
действительно красиво и ярко. Анимации присутствуют даже в главном меню.
Птицы выглядят очень живыми. Двигаются на ветке, моргают глазами и иногда
засыпают, что в дальнейшем оказалось будет отражено и в самом геймплее
игры. Эмоциональный стиль у этой игры положительный, сочетание цветов
тоже весьма тёплое и симпатичное, что привлекает к этой игре других людей.
Со звуком никаких проблем тоже не обнаружилось. Музыка весьма
подходящая игровому процессу на экране во время игры. Есть возможность
выключить или включить звук в любой момент в главном меню в разделе
«настройки». Замечу, что для звука и музыки нет ползунков громкости, поэтому
их регулирование целиком и полностью завязано на кнопки вашего телефона. В
настройках можно только выключить музыку, или вернуть её назад. Это
упрощение так-же очень здорово смотрится и помогает быстро подводить звук
игры под различные жизненные ситуации, тратя при этом минимум усилий.
Главное меню в игре сделано максимально просто, интуитивно и
доступно. Все элементы интерфейса в процессе игры отображаются корректно в
нужных местах экрана. В игре нет большого обилия настроек, зато в тех, что
имеются всюду чувствуется простота, дружелюбность, понятность. Думаю, что
эта черта играет очень важную роль в играх такого жанра.
Игровой процесс данной игры действительно соответствует канонам
жанра «три в ряд». Все тонкости игры сразу становятся понятными,
доступными для освоения, как только вы попробуете с ними взаимодействовать.
Запомнить их не составит труда.
Игровое поле в данной игре тоже выглядит красиво с визуальной точки
зрения. Элементы переставляются корректно по всем правилам игры своего
жанра. Сопровождается всё это красивой анимацией в виде выпадающих
перьев, да и вообще визуальная составляющая игры очаровывает с первых
минут. В игре так-же есть различные подсказки, которые помогают освоится
игрокам, которым данный жанр ранее был не знаком.
Рисунок 1.3 - Игровая сетка в игре Bird Paradise
Рисунок 1.4 - Экран завершения уровня в игре Bird Paradise
Подведём итоги, игра выполнена действительно здорово. Необычные
бонусы, яркая графика, интересный визуальный стиль. Всё это и многое другое
ждёт вас в игре Bird Paradise. А мы начинаем рассматривать другую игру этого
жанра, чтобы убедится в том, что основные детали и мелочи таких игр, должны
выглядеть именно так, как в этом примере.
1.1.3 ОБЗОР ИГРЫ MAGIC BLENDER
Требования игры: ОС: Android 2.3
Жанр: Аркада
Метки: Три в ряд, игра без кеша, таймкиллер
В игре Magic Blender нам дадут возможность стать волшебником,
который умеет варить и создавать различные волшебные зелья. Несмотря на то,
что данная игра выглядит вполне обычно в жанре «три в ряд», в ней имеются
дополнительные отличия в геймплее и естественно, непохожий игровой дизайн
и стиль. Если в большинстве игр, подобного жанра, есть лимит на количество
передвижений различных элементов, то тут появился ещё и лимит времени,
который даётся на прохождение данного уровня. Времени даётся немного,
поэтому игроку придётся действовать чётко и быстро, чтобы успеть и перейти
на следующий уровень. Решения должны быть не только молниеносными, но и
эффективными. Если вы долго не сможете найти решения, и эффективных
действий окажется мало, то придётся начинать уровень сначала. За счёт этого
игра очень зажигает азарт в игроке, а также отлично подходит для коротания
времени. Время будет постоянно подгонять игрока, что со временем
положительно скажется на его реакции и скорости принятии игровых решений,
что весьма замечательно для игр таких жанров. Игра не требует интернет
подключения, поэтому можно свободно играть, даже если интернета нет.
Основные особенности игры

Приятная красочная графика

Множество различных уровней

Возможность получить очки, после окончания матча
Как только мы запускаем игру, сразу оказываемся на загрузочном экране.
Изначально кажется, что игра сделана довольно-таки просто, однако это только
первое впечатление. Игра использует мощнейший движок для создания игр Unity, который представляет из себя огромный набор различных инструментов
для создания игр в 2D или в 3D. Размер игры составляет около 100 мб., что
после предыдущей игры кажется большой цифрой (предыдущая весила всего 16
мб.)
Рисунок 1.5 - Загрузочный экран игры Magic Blender
Рисунок 1.6 - Главное меню игры Magic Blender
Главное меню игры сделано так-же максимально просто и без лишних
кнопок для нажатий, но при этом содержит множество подсказок для игроков,
которые только-только начинаются знакомить с этим жанром. Это помогает им
быстрее понять суть происходящего на экране и научиться управлять игровым
процессом. Само меню сделано в 3D ориентации. Персонаж-волшебник
выглядит весьма живым и обьёмным, за счёт третьего измерения. В игре нет как
таковых настроек, которые вызывались бы из главного меню. В принципе, такое
решение тоже смотрится неплохо. Потому, что в предыдущей игре, которую мы
рассмотрели, других настроек кроме звука не было. В любой момент звук
можно очень просто настроить клавишами вверх и вниз на вашем мобильном.
Рисунок 1.7 - Экран выбора уровней игры Magic Blender
Рисунок 1.8 - Игровой экран игры Magic Blender
Все игровые сцены (экраны) в данной игре сделано исключительно с
использованием 3D. Это позволяет им положительно влиять на впечатления
игрока. Плавающие в небесах острова с возможностью выбрать нужные вам
уровни, выглядит просто феерично. Стоит сказать, что дизайн у данной игры в
целом выглядит более реальным по сравнению с первой игрой. Становится
заметна большая прорисовка и работа художников даже в реализации мелких
элементов. При выборе уровня ощущается, как разработчики мотивируют
игроков. Возможность перемещать камеру помогает им показать «высоты», для
достижения которых игроку придётся потратить приличное число игрового
времени.
Сам игровой процесс очень затягивает, несмотря на свою простоту.
Переставлять знакомые элементы игровой сетки, которые на этот раз
превращены в зелья, интересно. Тем более, что возможности переставить
элементы в этот раз не безграничны. И поначалу очень интересно исследовать,
за сколько попыток перестановок достигаются какие результаты. Помимо этого
время игры на каждом уровне у нас ограничено, поэтому игра всячески
пытается заставить игрока быстрее делать выбор в небольших игровых
событиях. Например, какие элементы сейчас переставить, чтобы сэкономить
время для прохождения уровней. Притом, если игрок долго не может найти
правильное решение, игра даёт ему подсказку. Это тоже очень положительная
черта такой игры.
Из необычайности этой игры можно отметить, что кнопка выключения
звука добавлена в сам игровой процесс. Она конечно имеет место там быть, но
выглядит непривычно. В целом дизайн игры тоже радует. Также стоит отметить
в ней необычную систему бонусов и итогового результата на уровне, который
определяется частично везением игрока. За прохождение каждого уровня
можно получить от 1 до 3х звёзд. Высокие результаты помогают открыть
следующие уровни, которые следуют за текущими.
Музыка в этой игре также не раздражающая и подходящая, хотя кажется
мне менее удачной в сравнении с тем, как было сделано в первом приложении,
которое мы рассмотрели. Звуки в этой игре, безусловно, играют важную роль.
Они помогают игроку ярче воспринимать разные игровые события, а также
быстрее реагировать на подсказки, которые появляются на экране.
Подведём итоги. Эта игра смотрится тоже очень и очень сильно на фоне
своих конкурентов. Её высокая популярность частично оправдывается тем, что
игра активно использует 3д и современные технологии. Даже механизм выбора
здесь отдельного игрового элемента на игровом поле отличается от того, что я
уже видел ранее. Здесь не нужно нажимать 2 раза на оба элемента, которые надо
поменять местами, достаточно нажать один и провести пальцем в ту сторону,
куда хочешь провести перемещение. Эти упрощения так-же помогают повысить
скорость игры, хотя и очень-очень незначительно. Игра действительно большая,
развёрнутая и полностью оправдывает своё присутствие в топе аналогичных
игр. Многие проекты по визуальному стилю действительно не могут показать
такие-же высокие результаты, каких добилась эта игра. Поэтому, это
действительно ценная находка для любителей этого жанра. Многим она
поможет провести приличное количество времени с интересом и надолго
затянуть.
1.1.4 ОБЗОР ИГРЫ ICE AGE: ARCTIC BLAST
ОС: Android 4.1
Категория: Аркада
Метки: Три в ряд, игра без кеша
Ice Age: Arctic Blast - очередная игра в знаменитом жанре три в ряд, где
вам предстоит отправиться в очень увлекательное путешествие вместе с
удивительной троицей - Сидом, Мэнни, Диего и знаменитой по серии
мультфильмов белкой- Скрэтом. Всю игру вас будут сопровождать знакомые
персонажи, а в самой игре самой главной задачей будет простое составление
драгоценных камней в ряды и их уничтожение, которое помогает игроку
очистить игровое пространство и заполнить его новыми. Путешествуйте в
компании друзей через ледяную долину, Дино море и другие необычные места,
набирайте достаточное количество очков, чтобы разблокировать в дальнейшем
все уровни, на которых откроются возможности решить все игровые
головоломки. Очищаясвой путь от камней, вы будете зарабатывать много очков,
а также получать море дополнительных бонусов, которые специально
припрятаны для вас. Игра очень увлекательная. Всё, что отделяет вас от
грандиозного прилючения - это выбор любимого героя из мультфильма, с
которым в дальнейшем вам придётся преодолевать разные преграды и
прокладывать путь к победе с первого до последнего уровня.
Рисунок 1.9 - Загрузочный экран игры Ice Age
Рисунок 1.10 - Главное меню игры Ice Age
Загрузочный экран игры сразу показывает нам знакомых по серии
мультфильмов
персонажей.
Пожалуй,
это
является
отличительной
особенностью данной игры. Потому, что в других играх, которые мы
рассмотрели, все персонажи были нарисованными отдельно для этого проекта и
ранее нигде не использовались.
Главное меню игры так-же выглядит стильно, в глаза сразу бросается 3D
формат изображений и картинок. Для самих персонажей в главном меню
сделали интересные и полноценные 3д сценки и анимации, где они
перемещаются, двигаются и смотрят друг на друга. Проработка таких сценок
явно заняла у разработчиков приличное количество времени, однако смотрятся
они действительно уместно, живо. У многих игроков после просмотра этих
сценок
скорее
всего
появится
даже
улыбка
на
лице,
связанная
с
воспоминаниями из самих мультфильмов, ведь персонажи несмотря на
преображение нисколько не изменились характерами и остались верными тем
прототипам, которыми их изначально сделали. Ещё одним плюсом является
даже
небольшое
количество
озвучки
персонажей
голосами,
которые
использовались и в самом мультфильме. Это сближает игрока с самой игрой.
В настройках здесь находится гораздо большее количество опций, чем
было в других проектах. Связано это с тем, что данную игру можно подключать
к социальной сети Facebook для того, чтобы можно было соревноваться с
друзьями и близкими людьми при прохождении различных типов уровней.
Остальные же настройки игры в целом повторяют аналогичные, однако тут
присутствуют «ползунки» громкости, которые я изначально не ожидал увидеть
после нескольких примеров, где их полностью перенесли на кнопки твоего
мобильного. Здесь это занесено, но можно дополнительно регулировать и
вручную. Плюс это или нет, сказать сложно. Однако радует, что в таких
мелочах чувствуются разные подходы к созданию игр этого жанра. В
«Ледниковом периоде», есть ещё множество геймплейных особенностей, про
которые я расскажу чуть позже.
Рисунок 1.11 - Экран выбора уровней игры Ice Age
Рисунок 1.12 - Игровой экран игры Ice Age
Игра на максимум использует 3д технологии будь то на экране выбора
текущего уровня, будь то в процессе самой игры. Приятные снежные
декорации, опять же наличие знакомых персонажей очень помогает игрокам
чувствовать себя в уютной атмосфере, какую нам подарили ещё в далёком 2001,
когда появилась первая часть этого мультфильма. Графика игры мультяшная, но
и весьма подходит для проекта такого типа. Она не раздражает. Все её элементы
по цветовой гамме в целом сочетаются и подходят друг-другу.
Игра также не имеет вертикальной ориентации. Это не удивительно, ведь
дополнительная альбомная ориентация должна идеально вмещать себя и
игровую сетку и персонажей, и разные gui-элементы интерфейса.
В самом же игровом процессе есть различные бонусы, необычные
эффекты. Перемещение в Ice Age элементов реализовано точно так-же, как как в
предыдущем проекте. Количество перемещений у нас ограничено, поэтому мы
должны находить самые эффективные и полезные решения, для того, чтобы
быстро набрать необходимое количество очков для перехода на следующий
уровень. Для перемещения элементов опять-же достаточно просто провести
пальцем, чтобы
заменить их
местами. Игровые сетки
здесь отдают
разнообразием, чего не было заметно в первых уровнях других проектов.
Элементы располагаются в каждом уровне несколько необычно (раньше был
просто квадрат или прямоугольник). Такая необычная мелочь так-же помогает
поддерживать интерес игрока, чтобы предложить ему ещё большее количество
удивительных уровней и соответственно разных игровых ситуаций, которые
ему придётся решать во время прохождения. Игровые элементы в очередной раз
сделаны в виде сверкающих камней, которые соответствуют тематике данной
игры.
Цветовая гамма в игре подобрана весьма кстати, что помогает быстро
освоиться. На первых уровнях игра так-же напоминает, как нужно переставлять
элементы. Это позволяет быстро научить новых игроков управлять игрой.
1.1.5 ОБЗОР ИГРЫ ICE CRUSH
ОС: Android 2.3
Категория: Головоломки
Метки: Три в ряд, игры без кеша
Ice Crush - Magian is coming - многие люди считают, что это очередная
игра жанра три в ряд, коих сейчас вокруг действительно огромное множество.
Однако, у этой игры имеется масса замечательных особенностей, которые
делают её уникальной и интересной для прохождения. Основное отличие этой
игры заключается в том, что целью (главным заданием игры), является далеко
не построение элементов в количестве по три. На каждом уровне нам дадут
особые цели и дополнительные условия, которые игрок будет должен
соблюдать при прохождении игры. Задания, которые даются игрокам в игре
очень разнообразны. Например, на некоторых уровнях мы должны будем играть
как обычно, но при этом не задевая особо выделенные блоки. Если мы это
сделаем, то уровень считается проигранным и игру нужно будет начинать
сначала. На части уровней нас ждут другие цели. Например, часть игровых
блоков будет покрыта особой защитой, для разрушения которой нужно будет
несколько раз выставить совпадения элементов. Причём так, как нам сказано в
основном задании. Игра действительно затягивает всех любителей жанра. Если
вам хочется интересно и увлекательно провести небольшое количество
времени, и при этом игра не должна быть замысловатой и затейливой, то Ice
Crush весьма может вам подойти. Попробуйте! Правда, бездумно ходить в этой
игре всё-таки не стоит. Нужно продумывать ходы и действовать точно по
придуманному плану.
Рисунок 1.12 - Загрузочный экран игры Ice Crush
Рисунок 1.13 - Главное меню игры Ice Crush
Сразу бросается в глаза необычный, яркий, зимний дизайн данной игры.
Приятная музыка сопровождает игрока сразу, как только он попал на
загрузочный экран этого приложения. Загрузка выглядит интересно, необычно,
волшебно.
Главное игровое меню сделано в таком-же визуальном стиле. В самом
центре находится кнопка начала игры, а выше можно найти специальные
кнопки для быстрого включения/выключения игровых звуков или музыки.
Стоит отметить, что при смене состояний звука не выходит никаких
дополнительных окон, которые могли бы раздражать игрока. Игра так-же имеет
возможность соединения с социальной сетью Facebook, что поможет
соревноваться с другими игроками.
Рисунок 1.13 - Экран выбора уровней Ice Crush
Рисунок 1.14 - Начальный экран раунда с игровой целью Ice Crush
Экран выбора очень красивый, стильный и соответствующий по стилю
тому, что мы уже увидели в главном меню. Потрясающая графика,
замечательно прорисованные снежинки. На экране выбора уровней идёт снег,
что очень красиво смотрится в игре. Экран выбора уровней возможно мотать
«вверх». Общее число уровней в игре составляет 540, что очень много. Игровые
цели на начальных уровнях очень просты и достигаются за 20-30 секунд
игрового времени.
Экран загрузки действительно яркий и запоминающийся. Мне понравился
больше, чем во всех остальных играх. Игровые цели предельно ясны.
Сложность соответственно будет возрастать по мере прохождения.
Вся игра сопровождается уникальными звуковыми эффектами. Музыка в
меню, звуки нажатия на определённые элементы очень классные. Звонки и
подходящие сказочной атмосфере зимы, которую пытаются передать нам
авторы этой игры.
Рисунок 1.15 - Игровой экран игры Ice Crush
Игровой процесс игры очень занимательный и затягивающий. Для
игроков как всегда имеется система обучения и подсказки, которые помогают
находить совпадения на экране. Количество ходов так-же ограничено.
Необходимо собрать определённое количество очков, чтобы перейти на
следующие уровни. Механика построения совпадений элементов здесь
несколько отличается от того, что было во второй и третьей игре, которые мы
рассматривали. Здесь снова нужно нажать на определённый блок, а после
нажать на тот, с которым ты хочешь их заменить местами.
После завершения уровней игра пишет нам наше количество очков и
количество монет, которое мы заработали. В дальнейшем мы сможем их
использовать для того, чтобы получить особые бонусы при прохождении
уровней. Результатами можно мгновенное поделиться на странице социальной
сети Facebook. Потрясающие сверкающие снежинки, всё это делает эту игру
сказочной. Несмотря на небольшой размер игры - всего 16 мб., её графика
действительно поражает и достойна восхищения. Не всем играм удаётся в такой
объём вложить интересные анимации, яркие эффекты и действительно
огромное количество уровней для игры.
1.2 ФОРМИРОВАНИЕ ТРЕБОВАНИЙ
На основе проектов, которые мы уже рассмотрели можно сделать массу
выводов о том, на что именно стоит обратить внимание при создании моей
версии игры знаменитого жанра. Разобрав досконально четыре масштабных
игровых проекта у меня появилось представление о том, что обязательно или
желательно должно быть в моём приложении.
Давайте
распишем
реализованы в нашей игре:
основные
требования,
которые
должны
быть
)Игра должна быть стабильной. Взаимодействие с любыми её элементами
и компонентами не должна привести к резкому завершению игрового процесса.
)Необходимо разработать сетку игры для того, чтобы можно было связать
координаты реальных игровых элементов с виртуальной их копией, по которым
будут высчитываться разные игровые события.
)Изначально при попадании в игру мы оказываемся в главном меню (без
или с загрузочным экраном до этого)
)В главном меню у нас должно находиться несколько кнопок. Начала
игры и настройки.
)В настройках игры не должно быть слишком много разных опций.
Желательно, чтобы были только настройки звука. Максимально простые и
понятные по соответствующим иконкам (глядя на которые сразу можно бы
было понять, за что они отвечают).
)При первом запуске игры необходимо будет создать файл сохранения
игровых данных, в который мы будем записывать результаты игровых сессий на
разных уровнях и сохранять общие игровые достижения игрока.
)В настройки можно будет вынести дополнительный пункт, при нажатии
на который у игрока теряется весь игровой процесс, что позволит начать ему
игру с самого начала.
)При нажатии кнопки играть мы должны попасть на новую игровую
сцену, где будут размещены различные игровые уровни.
)При прохождении одного игрового уровня, мы сможем переходить на
следующий. Максимально открытый уровень игры (записанный в файле
сохранений игрока), должен будет быть увеличен на единицу (следующий).
)После прохождения уровня можно будет вывести результаты его сессии.
Например, время, которое он провёл в игре на этом уровне.
)Так, как моя игра сделана больше для расслабления игрока - игровых
целей сложных не будет. Нужно будет просто собрать определённое количество
очков за совпадения, после чего будет открыт следующий уровень.
)Когда на игровом поле наблюдается реальная комбинация совпадений
(собранная), у игрока временно отнимают управления. Начинается цепочка по
удалению игровых элементов и очищению игрового поля.
)Как только все игровые события прошли, игра дополнительно добавляет
множество новых элементов на игровое поле. После этого сразу проверяется
наличие новых совпадений игровых элементов (по 3 в ряд/столбик и прочие),
после которого управление игроку вернётся только тогда, когда совпадений на
экране больше нет.
)Для выбора игрового элемента и последующей его перестановки мы
будем использовать клик на экран сенсора. Она фиксирует текущий игровой
элемент (как потенциальный для комбинации).
)Если игрок решает отвязать текущий игровой элемент, который он
выбрал ранее. Это будет сделано, когда он ещё раз нажмёт на него.
)Когда элемент для перестановки выделен, нужно будет выбрать другой
элемент (снизу, сверху, справа или снизу от текущего). После этого, если там
имеются совпадения элементов по 3 и более, элемент перемещается. Если нет,
то возвращается назад.
)Любое перемещение элементов на экране должно сопровождаться
соответствующей анимацией, чтобы игроку было проще и наглядно было видно
результат его действий.
)При уничтожении любых рядов элементов необходимо подключить
анимацию, чтобы она красиво подчёркивала это игровое событие.
)К различным игровым событиям необходимо добавить звуки, в которых
есть проверка на включённый или выключенный звук. Эти условия помогут
игре адекватно реагировать на переключение опций, связанных со звуком. И
сделают их работу максимально качественной.
)В главном меню игры необходимо добавить какую-нибудь музыку,
которая будет подходить визуальному стилю игры и подчёркивать её основные
развлекательные цели.
)В игре обязательно нужно добавить возможность поставить паузу,
игровое время после установки которой перестаёт учитываться и увеличиваться.
)После достижения основной игровой цели необходимо обязательно
проиграть звук, который подчеркнёт это игровое событие.
)Визуальный стиль игры должен быть светлым и необычным. Допускаю
использование таких элементов, как облака/снежинки. Любые положительные
мелочи, которые окружают нас в настоящем жизни.
)Изображение игровых элементов не должно сильно отличаться по стилю
рисовки от того, что я использую в главном меню своего приложения.
)В главное меню можно дополнительно добавить разных анимаций,
которые украсят игру и визуально улучшат её восприятие у пользователей.
)В игре не должно быть привязки к социальным сетям, ввиду
скоротечности проекта. Приложение будет полностью отвязанным от интернета
и не требовать для игры постоянного интернет-подключения.
)Сетка
игровых
элементов
будет
выполнена
в
виде
обычного
прямоугольника или квадрата, чтобы дополнительно не усложнять разработку.
)В игре должны быть объявлены основные переменные игровых
состояний. Например, игровое состояние 1 значит ожидание 1 элемента для
перестановки, а второе значит, что для перестановки необходимо выбрать уже
второй элемент.
)Игровая пауза также должна быть одним из игровых состояний, при
котором не учитываются все нажатия на игровые элементы и все события,
которые с ними происходят. Они будут возобновлены только тогда, когда
переменная паузы станет равной тому значению, означающему, что игра
продолжается и пауза снята.
)Из-за сложности создания 3d графики, для проекта я буду пользоваться
исключительно 2d.
В дальнейшем к игре может добавиться ещё множество требований. Здесь
я перечислил самые основные, на которые буду ориентироваться при разработке
своего приложения.
1.3 ВЫБОР ВАРИАНТА РЕШЕНИЯ
Для реализации задуманного проекта есть множество мощных игровых
движков, в которых есть возможность реализовать все задуманные мною идеи.
В качестве вариантов я рассматривал два таких игровых движка.
Первый - 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
AndroidManifes Файл манифеста AndroidManifest.xml предоставляет системе
t.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 Загрузка количества монет и проверка доступности бонусов
.7 Эффекты от использования игровых бонусов
.8 Прорисовка заднего фона
.9 Добавление возможности поставить паузу и кнопку выхода
.10 Внедрение игровых состояний (ждёт выбор элемента 1, ждёт выбор
элементов 2, ждёт разрушения игровых объектов, пауза и подобных)
. Доработка остальных деталей игры
.1 Дорисовка графики (где это необходимо)
3.2 Добавление красивых визуальных эффектов к игровым событиям
3.2 ПРОГРАММИРОВАНИЕ
Изначально для своей игры я решил создать два основных класса, которые
являются каркасом основной игровой части приложения. Первым классом
является игровой объект или gem. Он представляет из себя небольшой объект
минимального размера на игровом поле и занимает его незначительную часть.
Рисунок 3.2 - Один игровой объект полностью
В нашем случае объектом игровой сетки является простое изображение в
форме квадрата определённого цвета с 15 вариантами. Все варианты, которые
вы видите на рисунке выше являются настоящей анимацией. Из изображения
вырезаются квадраты размером по 85 пикселей, которые потом при быстрой
замене текущего изображения в игровом объекте (которым является наш gem),
создают непрерывную и плавную его анимацию. Анимация проигрывается не
всегда, а только при падении новых игровых объектов на экран и в самом
начале игры. Это сделано для того, чтобы снизить нагрузку на глаза игрока и
позволить им меньше уставать от игрового процесса.
Для того, чтобы создать хорошую анимацию игрового объекта, были
использованы знания программы Photoshop CS6. К каждому отдельному
квадрату добавлялись определённые эффекты. Например, тиснение. Этот
эффект увеличивался с определённым шагом до квадрата в центре, а затем
снова снижался до прежнего уровня, что позволяло нашему игровому объекту
вновь принять цвет, которым он обладал в начале игры или в момент первого
своего появления на игровом экране.
Класс gem в целом представляет из себя обычное игровое изображение с
анимацией, которое находится по определённым x,y координатам. Также класс
обладает типом, который определяет его цвет из файла и соответствующие
анимации.
В классе gem можно выделить только созданный метод gem:explode(),
который занимает очень важное место в игре.gem:explode()
- Проигрываем анимацию исчезновения
tween:to(self.sprite, { alpha=0, time=0.1, easing=ease.sineIn } )
-- Удаляем объект из игры.removeGem(self)
-
Добавляем
игровые
очки
за
уничтожение.addToRoundScore(gemDestroyedScore, self.type)
- Создаём эффект «взрыва» в указанной точке
explosion.createExplosion(self.sprite.x + gemActualWidth / 2, self.sprite.y +
gemActualHeight / 2, self.type)
end
Этот метод удаляет любой созданный игровой объект с экрана и создаёт
на его месте красивый эффект уничтожения. Благодаря ему игровой процесс в
самой игре развивается и действия игрока визуально подчёркиваются приятной
графикой. Также, этот метод отвечает за выпадение бонусов - монеток.
Рисунок 3.3 - Монетка
Большое количество монет позволяет нам использовать больше бонусов,
чтобы легче проходить любые уровни. Монетка с определённым шансом (в
зависимости от уровня), выпадает после уничтожения любого предмета на
экране. Количество монет игрока сохраняется в базе данных, которая
используется в игре, и помогает сохранить игровые достижения игрока.
Класс grid - это класс, который представляет из себя основную игровую
сетку, на которой располагаются отдельные gem-элементы. Выглядит это сетка
примерно вот так.
Рисунок 3.4 - Игровая сетка
Игровая сетка представляет из себя сложную структуру, в которой
описывается по сути весь основной игровой алгоритм. В сетке есть методы,
которые позволяют отслеживать нажатия на любые игровые элементы, которые
были в неё добавлены. Специальные методы в сетке конвертируют координаты
при нажатии, получая игровой объект, который по ним находится и переводят
их в номер, под которым он хранится в таблице - специальной структуре языка
Lua, которая здесь способна заменять массивы и является в нашей игровой
сессии основой хранения игровых данных.
Получаем x,y координаты сетки по нажатию на экран
function grid:screenToGrid(x, y)grid_x = math.floor((x - self.offsetX) /
gem.gemActualWidth
+
0.001)grid_y
=
math.floor((y
-
self.offsetY)
/
gem.gemActualWidth + 0.001)grid_x + 1, grid_y + 1
end
Получаем игровой объект, который находится по координатам x,y
function
grid:getGem(x,
y)grid_x,
grid_y
=
self:screenToGrid(x,
y)self.gemsGrid[grid_x][grid_y]
end
Кроме всего, что мы перечислили, именно сетка отвечает за игровые
бонусы. Особый её метод grid:useBonus(bonus_num), где bonus_num - номер
активированного в игре бонуса (1 из 6 видов). Помогает легко найти все
игровые объекты в ряду, столбце, или вообще перебрать всю сетку полностью
на игровые объекты, чтобы определить - какие из них требуется уничтожить.
Основной метод сетки - grid:regenerate()
Он позволяет генерировать новую случайную сетку игровых объектов с
любыми типами (цветами), игровых объектов. При этом в самом конце сетка
проверяется заранее на любые готовые совпадения игровых элементов и
перестраивает её так, чтобы их не осталось (иначе часть задачи игрока была бы
выполнена сразу после запуска игры).
-- Создаём новую сетку элементовgrid:regenerate()gem_index = 1
-- Делаем сетку и заполняем случайными элементами
for x = 1, self.width doy = 1, self.height do
- Пустые элементы удаляем(self.gemsGrid[x][y] == nil) then.gemsGrid[x][y]
=
self.matchedGems[gem_index].matchedGems[gem_index]
=
nil_index
=
gem_index + 1
-
Перезагружаем
координаты
сетки.gemsGrid[x][y]:setType(math.random(self.maxGemTypes)).gemsGrid[x][y].sp
rite.x = (x - 1) * gem.gemActualWidth + self.offsetX.gemsGrid[x][y].sprite.y = (y - 1)
* gem.gemActualHeight + self.offsetY.gemsGrid[x][y].sprite.alpha = 1
end
- Удаляем все 3+ сгенерированные совпадения
self:fix()
end
Однако, для игры недостаточно создать просто такую структуру. Она
должна быть обязательно подкреплена игровой логикой, которая по нашим
правилам должна пересчитывать все +3 совпадения в игровой сетки. Есть
специальный метод grid:checkMatches() он перебирает всю сетку на совпадения
три и больше в ряд/столбец различных игровых элементов и заносит их в
особую группу для дальнейшего удаления. Затем по логике игры уже
добавляются новые на место удалённых элементов и игра продолжается.
function grid:checkMatches()match = false
-- Очищаем лист наших элементов для удаления
for i in pairs(self.matchedGems) do[i] = nil
- Проверяем столбцы матчаx = 1, self.width docount = 0focusox, oyy = 1,
self.height dogem = self.gemsGrid[x][y]current = gem.type(count == 0) then=
current= 1= x= y(current == focus) then= count + 1(current ~= focus or y ==
self.height) then
-- Удаляем совпадения в колонках(count >= 3) then
match = truei = 1, count do
-
Добавляем
элементы
в
удалялку:addGemToMatches(self.gemsGrid[ox][oy])= oy + 1= current= x= y= 1
end
- Проверяем строки на 3 и более
for y = 1, self.height docount = 0focusox, oyx = 1, self.width dogem =
self.gemsGrid[x][y]current = gem.type(count == 0) then= current= 1= x= y(current
== focus) then= count + 1(current ~= focus or x == self.width) then
-- Заносим в удалялку элементы(count >= 3) then
match = truei = 1, count do:addGemToMatches(self.gemsGrid[ox][oy])= ox +
1= current= x= y= 1
-
Удаляем
элементы(#self.matchedGems
>
0)
then:playSound("audio/gem_destroyed.raw")i,g in ipairs(self.matchedGems) do
--Вызываем метод их взрыва:explode()match
После того, как в сетке были описаны все необходимые в процессе игры
методы и мелочи, оставалось только добавить дополнительный класс селектора,
который
помогал
бы
в
управлении
игрой
пользователю.
Подробно
рассматривать данный класс не стоит. Так, как в его функции входит простая
«отметка» того элемента на игровой сетки, на который нажал игрок. После
этого, уже относительно этой метки можно обменивать выбранный элемент с
любыми, что находятся выше-ниже, или левее-правее, но не более, чем на 1
клетку от него.
Если благодаря перестановки элементов будет найдено 3+ совпадение, то
игра позволит окончательно сдвинуть эти элементы местами и поменять их.
Если же такого не будет, то игра просто проиграет красивую анимацию и вернёт
всё на свои места.
3.3 СПИСОК ИГРОВЫХ СОСТОЯНИЙ
Специально для удобного управления игрой были добавлены игровые
состояния - переменные, которые определяют, какие действия пользователя
сейчас возможны, а какие нет. Стоит рассмотреть их подробнее.
- Список игровых состояний= {
waitingSecondGem
= 2,
= 0,
= 3,
= 1,
= 4,
= 5,
}- пауза. Игра приостановлена. Нельзя выбирать какие-либо элементы.
Управления игрока самим процессом игры полностью отключено. Можно
только нажать на кнопку выхода, которая появляется в верхней части экрана.
WaitingFirstGem - игра ждёт, пока мы выберем один из игровых элементов
на экране нажатием.
WaitingSecondGem - мы уже выбрали первый элемент для перестановки и
игра ждёт второй, после нажатия на который будет произведён обмен и
возможно, игра перейдёт в следующие состояния.
Tninking - игра анализирует результаты наших действий, удаляет блоки и
добавляет в игровую сетку новые. Управление у игрока полностью отключено в
этот момент и он не может ничего сделать, кроме поставить паузу.
GamsFalling - стадия, когда игра добавляет в игровую сетку новые
элементы, так-же не позволяя игроку вмешиваться. В конце этой стадии вновь
происходит обдумывание получившихся результатов и игра может перейти
снова в стадию thinking. Так будет до тех пор, пока сетка полностью не будет
очищена от всех три в ряд совпадений.
RoundOver - последняя стадия, которая заканчивает игру. Забирает
управление, отключает возможность паузы. Проигрывает красивый эффект и
закрывает уровень.
Благодаря добавлению в файл game.lua специальных вставок с проверкой
состояний игры, удалось достичь высокого её качества, запрета определённых
игровых действий в нужные моменты и придать чёткости игровым правилам.
3.4 РАЗРАБОТКА ИНТЕРФЕЙСА
В целом, интерфейс всех игровых сцен аналогичен. К определённым
спрайтам привязываются определённые проверки на их нажатие. Любой эвент
выглядит и описывается так, как показано ниже и представляет из себя
функцию. Например, вот полное описание эвента на выход из игры в главном
меню.
При создании сцены изначально мы добавляем эвент на «прикосновение»
к элементу (кнопке выхода), после нажатия на которую запускается функция
exitButtonTouched
Привязываем
эвент
к
нашей
кнопке
выхода
из
игры:addEventListener("touch", exitButtonTouched)
Функция выхода из игры и остановки движка
function exitGame(event):quit()
-
Эвент
нажата
выходаexitButtonTouched(event)(event.phase=="ended")
alpha=0.2,
time=0.5
}
):to(exitText,
{
alpha=0.2,
кнопка
then:to(exitText,
delay=0.25,
{
time=0.75,
easing=ease.expIn} )
- Играем анимацию, после которой запускаем функцию exitGame
tween:to(exitButton, { alpha=0.2, delay=0.25, time=1.25, easing=ease.expIn,
onComplete=exitGame } )
end
Компонент движка tween позволяем нам создавать разные анимации с
игровыми объектами, как уже рассказывалось ранее. Благодаря ему без
добавления специальных эффектов можно изменять за время прозрачность,
перемещать объект в любые координаты экрана плавно с течением времени,
растягивать по любым осям и много чего ещё.
В целом, весь пользовательский интерфейс построен на эвентах,
привязанных к определённым объектам на экране. Давайте рассмотрим все
игровые сцены, как они выглядят и что на них изображено.
Первая сцена - главное меню.
Рисунок 3.5 - Главное меню игры
В главном меню с точки зрения интерфейса пользователя будут только 2
элемента. В конечной версии приложения галочка и крест снизу будут убраны
потому, что отвечают за читы для быстрого открытия всех уровней приложения.
И удобной демонстрации всех возможностей игры без траты времени на
прохождение. Остальные же кнопки играть и выход будут оставлены в игре.
Первая из них переводит игрока на экран выбора уровней, а вторая закрывает
игру.
Вторая сцена - экран выбора уровней.
Рисунок 3.6 - Экран выбора уровней
На экране выбора уровней есть много активных элементов, которые
построены по аналогиями с кнопками из главного меню. Имеется 6
миров-категорий, в каждой из которых содержится по 5 уровней. Если уровни
открыты, то сверху будет зелёный цвет. Если уровень недоступен, то будет
подсвечен красным. При нажатии на любой из этих уровней запускается игра с
теми параметрами, которые соответствуют этому уровню. При завершении
любого уровня, открывается следующий для прохождения. В каждом из миров
меняются цвета игровых элементов и задачи становятся сложнее, но и монет,
которые может найти игрок становится больше.
Третья сцена в игре игровая.
Рисунок 3.7 - Экран игровой сцены
Интерфейс игровой части строился по аналогии с теми приложениями,
которые мы уже рассматривали в самом начале. Все игровые события так-же
сделаны аналогично. Нажатием на монетку можно поставить паузу и вызвать
кнопку выхода из игры. Все игровые элементы реагируют на нажатия.
Необходимо достигнуть нужное для завершения уровня количество очков.
Задний фон для красоты постоянно меняет цвет. Также за монетки можно
использовать бонусы, которые находятся в верхней части экрана. Активируются
они по нажатию. В самом верху будет появится шкала прогресса, которая
поможет понять, насколько вы близки к завершению уровня. Также каждые 10
сек. Игра выбирает случайный тип игрового объекта, за уничтожение таких
блоков вы получаете двойные очки и быстрее достигаете игровую цель.
4. НАСТРОЙКА, ОТЛАДКА И ТЕСТИРОВАНИЕ
4.1 ТЕСТИРОВАНИЕ СОХРАНЕНИЯ ДАННЫХ
Отладка большинства компонентов и функций игрового приложения
проходила сразу в процессе их разработки.
В первую очередь была необходимость проверить работу базы данных,
которая связана с проектом и в которой хранятся игровые данные. На том этапе
создания, игры как таковой у меня ещё не было. Была сделана тестовая версия
приложения, в котором можно было изменить количество монет и вывести на
экран. Результаты сохранения данных оказались очень положительными. На
телефоне, и на компьютеры данные создавались корректно. Новая база данных
создавалась при самом первом запуске игры. Если хранилище gameDB.bin у
игрока отсутствовало - создаётся новая база, в которой автоматически
добавляются нужные таблицы и данные в них, которые соответствуют началу
игры.
В начале игры у игрока нет никаких монет на бонусы и все уровни, кроме
первого, являются закрытыми и поиграть в них невозможно. Сделав
специальные команды на обновления данных в хранилище и проверки
доступности любых уровней, тщательно протестировав полученные результаты.
Мы убедились в том, что база данных полностью соответствует нашим
требованиям. Игровые данные сохраняются и могут по мере необходимости
вновь загружаться для использования. После перезагрузки, перезапуска
приложения, ничего не меняется и всё, чего добился игрок остаётся.
Все функции по работе с базой данных и игровыми сохранениями
находятся в файле database.lua.
4.2 МОДУЛЬНОЕ ТЕСТИРОВАНИЕ
Так, как моя игра включает в себя огромное количество различных
файлов, тестировать пришлось множество модулей и классов, которые являлись
важными составляющими игры.
В первую очередь тестирование проводилось в двух самых важных
классах игры - классе gem (игрового объекта) и классе grid (игровая сетка). В
этих классах было множество различных методов от создания отдельных
элементов на экране, до создания целых сеток размером с половину экрана,
которая заполняется случайными игровыми объектами. При разработке данных
классов было потрачено больше всего сил и времени, поэтому на
окончательном этапе тестирования ошибок в них не обнаружилось. Все классы
работают корректно, все методы класса вызываются правильно. Данные были
точны. Все три в ряд совпадения, найденные в игровой сетке учитывались.
Когда основные два класса были просмотрены, было проведено
тестирование
вспомогательных
классов
selector
(выбиратель
игровых
элементов) и класса explosion (взрыватель). Так, как эти классы гораздо меньше
тех, что мы рассмотрели ранее. Их тестирование прошло быстро. Ошибок не
обнаружилось. Селектор правильно запоминал выбранные элементы в процессе
игры и в игровой логике всегда точно определялось, в какие стороны игрок
может переставить текущий элемент.
В конце модульного тестирования мы убедились, что классы, описанные в
файлах gem.lua, grid.lua, selector.lua, explosion.lua работоспособны.
4.3 ФУНКЦИОНАЛЬНОЕ ТЕСТИРОВАНИЕ
На дальнейшем этапе тестирования необходимо было проверять
множество отдельных компонентов на всех трёх игровых сценах. Прежде всего
это включало в себя проверку работоспособности кнопок, которые управляют
приложением.
Таблица 2 - Функциональное тестирование
Функция
Меню: кнопка играть
Меню: кнопка выход
Экран выбора уровней: выбор мира
Экран выбора уровней: кнопка назад
Экран выбора уровней: выбор уровня для
игры
Игровой экран: пауза
Игровой экран: выход
Игра: перестановка элементов
Игра: падение новых элементов
Игра: использование бонуса
Игра: завершение уровня
Результат
Приложение переносит нас на экран выбора уровней.
После нажатия данной кнопки игра заканчивает свою
работу.
Выбор игрового мира, в котором находятся 5 уровней
происходит корректно. Выше появляются именно те
уровни, что находятся здесь.
Возвращает нас в главное меню, где есть кнопка
играть и выход.
Выбор уровня происходит корректно. Игровые цели
подбираются безошибочно, цвета в игре так-же
соответствуют своим «мирам».
При установке паузы игра замирает. Можно покинуть
уровень, или отключить её повторным нажатием.
Переносит нас на экран выбора уровней, где мы
можем выбрать другой или выйти.
Кнопка возврата в меню выполняет свою функцию
Кнопка перехода на игровую сцену выполняет свою
функцию
Объекты генерируются на протяжении всего сеанса
игры на рабочей области
Появляется красочное изображение и салют, которые
говорят о завершении.
Все виды тестирования показали, что игра работает корректно. В игровых
мелочах не было замечено неправильной их работы. Все анимации в игре
плавные, облака плывут корректно. Очков начисляется именно столько, сколько
своими действиями заработал игрок. Тестирование показало, что приложение не
вылетает и не сбоит.
4.4
ТЕСТИРОВАНИЕ
ИНСТАЛЛЯЦИИ
И
ОТОБРАЖЕНИЯ
ЭЛЕМЕНТОВ
Собранное в Marmalade SDK приложение корректно установилось и
отображалось на нескольких телефонах. Было произведено тестирование как на
моём личном телефоне (Philips W6610), так и на телефонах моих друзей.
Результаты тестов показали, что правильные формулы расчёта расположения
игровых элементов работают замечательно на всех экранах. «Замороженная»
портретная ориентация так-же не слетает, когда мы наклоняем свой планшет
или смартфон. Результаты, полученные на компьютере в специальном
«симуляторе» также подтвердили, что информация является достоверной. Даже
установление очень маленьких или высоких разрешений планшета показало то,
что графика гибко «подстраивается» под размер нужного экрана и при этом
элементы интерфейса не налезают друг на друга.
Рисунок 4.1 - Главное меню игры в разрешении 320 на 480
5. РАЗРАБОТКА РУКОВОДСТВА ПОЛЬЗОВАТЕЛЯ
5.1 ОБЩЕЕ ОПИСАНИЕ
Программа представляет из себя казуальное игровое приложение на
платформу Android версии 3 и выше.
Программа предназначена исключительно для развлечения и интересного
провождения небольшого количества свободного времени. Основная аудитория
программы - люди, которым нравятся простые и не сложные игры, которые
максимально легко освоить.
Игра не планирует отнимать у вас огромное количество времени, и полное
прохождение всех её уровней займёт от 2х до 6-ти часов реального времени
(максимум). Рекомендуется проходить данную игру не сразу целиком, а играя в
неё периодически.
5.2 ОПИСАНИЕ ИГРОВЫХ СЦЕН
Интерфейсы каждой игровой сцены игры максимально просты для
освоения и не нагружены лишней информацией и различными элементами.
В главном меню находится кнопка играть и кнопка выхода. На экране
выбора уровней есть кнопка вернутся назад и есть возможность выбрать любые
уровни для прохождения (если они у вас открыты). В дальнейшем, при выборе
уровня вы попадаете в игру. Становятся активны бонусы в верхней части
экрана, если вам хватает монеток для их активации. Все элементы на экране
можно сдвигать. Пауза устанавливается нажатие на монетку в верхней части
экрана, там же можно вернутся назад на экран выбора уровней. При его
завершении вам откроется следующий (на 1 выше), если он ещё не открыт.
5.3 ОПИСАНИЕ ИГРОВЫХ ПРАВИЛ
Игровые правила. Можно сдвигать любой выбранный элемент в 4
стороны только в тех местах, где они не находятся на краю экрана. В остальных
случаях часть вариантов будет закрыта. Двигать элементы по диагонали
запрещено. Бонусы можно использовать только тогда, когда игра ждёт вашего
хода. Нельзя будет вмешаться в игру, если она сейчас просчитывает результаты
ваших действий и заполняет пустые клетки игровой сетки. Только тогда, когда
совпадений не останется, игра вернёт вам управление и возможность
использовать бонусы. Пауза приостанавливает любую реакцию игры и очищает
специальные эффекты. Иногда после вашего хода дополнительно разрушается
случайный элемент на игровом экране. Каждые 10 секунд игра сама будет
выбирать
особый
элемент,
за
уничтожение
которых
вы
получите
дополнительные очки, что позволит вам быстрее завершить уровни. Цель
любого уровня - набрать определённое число очков. После выполнения игровой
цели вы увидите небольшой салют и вас вернёт после него к экрану выбора
уровней, где уже открылся следующий. Статус открытости уровней сохраняется
сразу, как и количество монет. Игра запоминает все ваши игровые достижения
сразу, как вы их получили, а не только тогда, когда вы захотите её выключить.
5.4 ПОЯСНЕНИЯ ПО ТЕХНИЧЕСКИМ ВОПРОСАМ
Звук
приложения
можно
регулировать
аппаратными
клавишами
громкости на вашем смартфоне.
Приложение
можно
в
любой
момент
выключить
через
саму
операционную систему. Иногда это даже проще, чем выходить в главное меню
игры.
Для установки игра требует примерно 20 мегабайт на внутренней памяти
телефона. В дальнейшем, игру можно будет перенести на sd карту для
небольшой экономии места.
В игре нет никаких покупок за реальные деньги. Единственное, что при
запуске
приложения
будет
показываться
небольшая
реклама
(из-за
использования бесплатной версии движка, нельзя её вырезать). К моей реклама
эта отношения не имеет.
ЗАКЛЮЧЕНИЕ
В процессе работы над ВКР был проведен подробный анализ аналогичных
приложений, уже существующих на рынке. Были выделены основные их черты
и особенности, часть которых в дальнейшем использовались и были добавлены
в мой проект. Для создания игры был выбрал игровой движок, на котором
реализована вся игровая механика, все её компоненты и игровые классы.
Графическая составляющая приложения была создана с нуля при помощи
средства Photoshop CS6. К игре была подключена небольшая база данных,
сделанная на SQLlite. В ней сохраняются достижения игрока. После окончания
разработки было проведено тестирование игрового приложения, по результатам
которого не было обнаружено никаких ошибок. В дальнейшем, мой игровой
проект может быть опубликован, чтобы помочь людям в разработке
аналогичных приложений для смартфонов.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
1. Marmalade Quick[Электронный ресурс]: Marmalade Documentation/ Marmalade
Quick
-
Режим
доступа:
http://docs.madewithmarmalade.com/display/MD/Marmalade+Quick
2. Marmalade [Электронный ресурс]: Википедия/ Marmalade SDK - Режим
доступа: <https://ru.wikipedia.org/wiki/Marmalade_SDK>
. SQLite 3 [Электронный ресурс]: LuaSQLite/ SQLite 3 - Режим доступа:
http://luasqlite.luaforge.net/lsqlite3.html
. Lua [Электронный ресурс]: Википедия/ Lua - Режим доступа:
https://ru.wikipedia.org/wiki/Lua
. Справочное руководство по языку Lua [Электронный ресурс]: Lua/ Справочное
руководство по Lua 5.1 - Режим доступа: http://www.lua.ru/doc/
. Unity [Электронный ресурс]: Википедия/ Unity (игровой движок) - Режим
доступа: https://ru.wikipedia.org/wiki/Unity
ПРИЛОЖЕНИЕ 1
(функции игровой сцены)
-- Создаём новый игровой раундinitRound()
- Запускаем все игровые таймеры:resumeTimers():resumeTweens()
- Закрываем все таймеры игровой сценыi,v in ipairs(gameScene.timers)
do:cancel().timers[i] = nil
end
- Закрываем все анимации игровой сцены
for i,v in ipairs(gameScene.tweens) do:cancel().tweens[i] = nil
- Восстанавливаем целую сетку:regenerate()
--
Создаём
игровую
цель-гем,
который
меняется
каждые
15
секунд:addTimer(chooseTargetGem, 15, 0, 0)
- Вспомогательные таймеры на удаление спрайтов и обновление монет
gameScene:addTimer(deleteHideSprites, 5, 0, 0):addTimer(moneyChanges,
0.5, 0, 0)
-
Запускем
игру,
устанавливая
ожидание
1
хода(gameStates.waitingFirstGem)
end
- Функция на проверку касания к игровым элементам
local touch = function(event)(director:getCurrentScene() == gameScene and
event.phase == "ended") then(gameState == gameStates.roundOver) then(event.y <
gridActualHeight) then
- Получаем координатыgrid_x, grid_y = gemsGrid:screenToGrid(event.x,
event.y)(gameState == gameStates.waitingFirstGem) then
-
При
ожидании
1
элемента,
записываем
grid_y(gameStates.waitingSecondGem)(gameState
1[1]
=
grid_x[1]
=
==
gameStates.waitingSecondGem) then
- При ожидании 2 элемента, записываем 2[2] = grid_x
gridTouchesY[2] = grid_ydx = gridTouchesX[2] - gridTouchesX[1]dy =
gridTouchesY[2] - gridTouchesY[1]
Начинаем перестановку((dx == 0 and (dy == -1 or dy == 1)) or (dy == 0 and
(dx == -1 or dx == 1))) then
-- Когда перестановка элементов возможна, переводим игру в режим, где
высчитываются ходы
changeGameState(gameStates.thinking):playSound("audio/gem_swap.raw")
else
- Переводим игру в режим ожидания 1 хода, если перестановка 3+ в ряд не
получилась у игрока
changeGameState(gameStates.waitingFirstGem)
-audio:playSound("audio/gem_wrong.raw")
end
Функция на использование бонуса
function TouchBonus_2(event)(event.phase=="ended") then(gameState ==
gameStates.waitingFirstGem or gameState == gameStates.waitingSecondGem) then
selector:hide()
- Получаем количество монет наших
monets_player=check_player_money(1)
- Если монет хватает, активируем бонус и обновим число монет
if
(monets_player>=cost[2])
then_player_money(1,-cost[2])_money_text():useBonus(3)
ChangeBonusState()
-Запускаем таймер, пока сетка обновляет удалённые элементы
gameScene:addTimer(startGemsFalling, 0.1, 1, 0)
end
- Инициализируем игровой экранinit()
-- Создаём основную сцену игры= director:createScene()
--Создаём UI()
-Устанавливаем игровые цели(play_level)
-Перезагружаем цветовые спрайты в зависимости от уровня
gem.reload_colours(play_coub)
-- Убираем предыдущую сетку элементов= nil
gemsGrid = grid.new(gemCountX, gemCountY, gridOffsetX, gridOffsetY,
maxGemTypes)
-- Создаём селектор, выбирающий элементы= nil= selector.new()
- Запускаем новую игровую сессию()
-Добавляем элементы на обновление (прикосновения к экрану)
system:addEventListener("touch", touch):addEventListener("update", update)
end
ПРИЛОЖЕНИЕ 2
(блок-схема алгоритма)
Download