Разработка приложения для мобильных устройств на базе ОС Android

Анализ популярных игровых приложений. Жанр – аркады с геймплеем Runner. Получение продукта, ориентированного на людей, использующих мобильные устройства на базе Android, и предназначенный для развлечения пользователей. Визуальная составляющая приложения.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 10.07.2017
Размер файла 742,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Введение

1. Постановка задачи

1.1 Основные понятия и определения

1.2 Общее описание разрабатываемого проекта

1.3 Аналитический обзор существующих аналогов

2. Анализ и выбор программных средств

2.1 Теоретические основы

2.2 Аналитический обзор

2.2.1 Обзор игровых движков

2.2.2 Обзор средств анимации

2.3 Выбор программных средств

3. Разработка продукта

3.1 Разработка интерфейса

3.2 Разработка дизайна интерфейса

3.3 Разработка приложения

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

3.3.2 Разработка игровой сцены

3.3.3 Разработка меню и всплывающих окон

4. Тестирование

4.1 Обоснование методики тестирования

4.2 Результаты тестирования

4.2.1 Результаты модульного тестирования

4.2.2 Результаты функционального тестирования

4.2.3 Результаты тестирования инсталляции

Заключение

Список использованных источников

Приложения

Введение

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

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

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

1. Постановка задачи

1.1 Основные понятия и определения

Runner - термин, характеризующий геймплей компьютерной игры, в котором главный герой двигается в одном направлении, преодолевая препятствия.

Геймплей (англ.gameplay) - игровой процесс с точки зрения игрока. Включает в себя разные содержательные аспекты игры, в том числе технические, такие как внутриигровая механика, совокупность определённых методов взаимодействия игры с пользователем и др[1].

Игровой движок - центральный программный компонент компьютерных и видеоигр, а также других интерактивных приложений, имеющих графику, обрабатываемую в реальном времени. Он предоставляет основные технологии, упрощает и ускоряет разработку, а так же дает приложению запускаться на разных платформах[2].

Графический движок (иногда "рендерер" или "визуализатор") - промежуточное программное обеспечение, основной задачей которого является визуализация (рендеринг) двухмерной или трёхмерной компьютерной графики[3].

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

Сценарный язык (язык сценариев, жарг. скриптомвый язык; англ. scripting language) - высокоуровневый язык сценариев (англ. script) - кратких описаний действий, выполняемых системой. Разница между программами и сценариями довольно размыта. Сценарий - это программа, работающая с готовыми программными компонентами.

Согласно Джону Устерхауту, автору языка Tcl, высокоуровневые языки можно разделить на языки системного программирования и сценарные языки. Последние он также назвал склеивающими языками или языками системной интеграции. Сценарии обычно интерпретируются, а не компилируются, хотя сценарные языки программирования один за другим обзаводятся JIT-компиляторами (JIT-компиляция (англ. Just-in-time compilation, компиляция "на лету"), - технология увеличения производительности программных систем, использующих байт-код, путём компиляции байт-кода в машинный код или в другой формат непосредственно во время работы программы[6].).

В более узком смысле под скриптовым языком может пониматься специализированный язык для расширения возможностей командной оболочки или текстового редактора и средств администрирования операционных систем[5].

Спрайт - это графический объект в компьютерной графике. Под спрайтами подразумеваются рисунки, которые выводятся на экран с помощью аппаратного ускорения. До начала 1990х годов понятие спрайт распространялось на всех двумерных персонажах, а после развития мультимедиа и повышения глубины цвета вышло программное обеспечение, которое ввело общий API для двухмерной и трехмерной графики. То есть сейчас двухмерные изображения выводятся, как и трехмерные[7].

Полигональная сетка - это совокупность вершин, рёбер и граней, которые определяют форму многогранного объекта в компьютерной графике и объёмном моделировании[8].

Вес кости - определяет степень влияния кости на вершину полигональной сетки.

1.2 Общее описание разрабатываемого проекта

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

Анализ популярных приложений показал, что сейчас между собой конкурируют 3 жанра: головоломки, аркады и экшн-игры. Для разрабатываемого продукта был выбран жанр - аркады с геймплеем Runner.

В результате разработки должен получиться продукт, ориентированный на людей, использующих мобильные устройства на базе ОС Android, и предназначенный для развлечения пользователей. Он будет представлять собой 2D игровое приложение в жанре аркада с геймплеем Runner. Визуальная составляющая приложения будет реализована следующим образом: в качестве фона выступает серый экран, а в качестве персонажей - темные контуры людей. Такой стиль не будет сильно нагружать оперативную память устройства, что увеличит количество устройств, способных запустить приложение, а также, в силу простоты исполнения картинки, он позволит разработчику уделить больше времени другим аспектам разработки как рефакторинг кода. Более того, такой стиль будет оказывать наименьшее негативное воздействие на глаза. Опыт показывает, что яркая картинка с большим количеством мелких элементов хорошо смотрится на экранах с большим разрешением, но на экранах с маленьким разрешением она начинает быстро утомлять глаза пользователя.

Геймплей разрабатываемого проекта будет слегка отличаться от каноничного Runner'а, где задачей игрока является преодоление как можно большего расстояния и преодоление препятствий с помощью одного лишь прыжка, за преодоление определенного расстояния начисляется определенное число очков, если игрок не преодолевает препятствие, игра заканчивается. В разрабатываемом проекте, помимо функции прыжка будет присутствовать функция удара. Задачей игрока будет преодоление разрывов в опорной поверхности и уничтожение противников. За преодоление определенного расстояния будет начисляться определенное количество очков. За уничтожение противника так же будут начисляться очки. Таким образом, основная цель игрока останется прежней - набрать как можно больше очков, но игровой процесс при этом усложнится в силу того, что за уничтожение противника будет начисляться больше очков, чем за прохождение одной единицы расстояния, но если игрок неправильно расчитает время и нанесет удар раньше, то противник нанесет удар по персонажу и игра закончится. Естественно, у игрока будет возможность просто перепрыгнуть противника и бежать дальше, но тогда ему придется потратить больше времени на набор очков. В проекте будет реализована автоматическая генерация мира, иными словами игровые объекты (платформы и противники) будут генерироваться автоматически на определенном расстоянии перед персонажем. Скорость движения персонажа будет постоянно увеличиваться, что усложнит достижение высоких результатов. Так же, увеличение скорости не даст игроку войти в ритм игры и идеально выбирать момент для нанесения удара или прыжка.

1.3 Аналитический обзор существующих аналогов

В современной игровой индустрии существует множество игр с геймплеем Runner. Наиболее популярные из них представлены в таблице 1. Для разработки применяются различные технологии и методологии. Каждая из представленных в таблице 1 игр выпущена под лицензией Freemium, позволяющей разработчику условно-бесплатно распространять продукт. Тем самым привлекая более широкий круг пользователей.

Таблица 1 - Характеристики игр с геймплеем Runner

Характеристика

Название игры

Temple Run

Subway Surfers

Jetpack Joyride

Вид

3D

3D

2D

Разработчик

Imangi Studios

Kiloo и SYBO Games

Halfbrick Studios

Платформы

iOS, Android, Windows Phone

iOS, Android, Windows Phone, Windows

iOS, Flash, Android, PlayStation Network, Windows Phone 8, Windows 8

Лицензия

Freemium

Freemium

Freemium

Управление

Сенсорный экран

Сенсорный экран

Сенсорный экран

Дата выпуска

4 августа 2011

24 мая 2012

1 сентября 2011

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

2. Анализ и выбор программных средств

2.1 Теоретические основы

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

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

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

Средство для создания анимации может использовать как автоматический так и ручной тип анимирования. Автоматическая анимация подразумевает создание ключевых кадров, которые соответствуют неким формам и движениям и автоматическое заполнение промежуточных кадров. Автоматическая анимация применяется в средствах для создания скелетной анимации.

При ручной анимации каждый кадр рисуется разработчиком заново. Такой тип анимирования используется в Adobe Animate, Photoshop и др.

2.2 Аналитический обзор

2.2.1 Обзор игровых движков

На сегодняшний день существуют 3 наиболее популярных и конкурирующих между собой движка для разработки игр - Unity, UDK и Cry ENGINE.

Unity - игровой движок с широким спектром возможностей, удобным и дружественно настроенным интерфейсом. Его основной плюс - мультиплатформенность, что означает легкое и быстрое портирование проектов под такие платформы, как Android, iOS, Windows Phone 8 и BlackBerry. Кроме этого, с помощью Unity можно также разрабатывать игры для PS 3, Xbox360, Wii U и веб-браузеров.

Графический редактор Unity может выполнять весьма ограниченный ряд операций. В нем нельзя моделировать. Исключение составляет базовая работа с примитивами. Однако, Unity без проблем интегрируется со сторонними 3D-редакторами (3D Maya, 3Ds Max, Softimage, CINEMA 4D, Blender и пр.), что означает отсутствие проблем с чтением различных форматов. А после релиза Unity 4.3 стала возможна работа с 2D-графикой, поддерживая спрайты и 2D-физику, благодаря чему с помощью движка можно также создавать графику для 2D-игр.

Существует две версии Unity: бесплатная и Pro. Pro-версия движка стоит $1,500 или $75/мес. Она имеет освещение типа global, возможность render-to-texture, IK-риги Mecanim и пр. Бесплатная версия Unity снабжает контент вотермарками, избавиться от которых весьма проблематично.

Unreal Development Kit или UDK - бесплатная версия движка Unreal Engine 3, написанного Epic Games, который используется для разработки многих игр. Этот движок обладает высокими графическими возможностями и может также использоваться для разработки мобильных игр. У UDK, в отличие от Unity, есть свой собственный мощный инструмент для дизайна игровых уровней непосредственно в самом движке.

Главным образом, Unreal Engine разрабатывался для создания FPS. У Unreal есть собственный объектно-ориентированный язык программирования для написания скриптов, похожий на Java или C++.

UDK, как и Unity, работает с различными платформами, включая iOS, Android, Windows Phone 8, Xbox360, PS 3, Playstation Vita и Wii U.

Как и в случае с Unity, платить за UDK придется только в случае релиза проекта. На момент издания проекта необходимо заплатить лицензионный сбор в размере $99. Также, если вырученная за игру прибыль превысит $50,000, требуется заплатить от нее 25%.

CryENGINE - движок, разработанный компанией Crytek, и впервые представленный в первой части Far Cry. С помощью этого движка можно создавать игры под ПК и консоли, включая PS4 и Xbox One. Не вдаваясь в подробности, скажу, что графические особенности CryENGINE значительно превосходят возможности первых двух движков. CryENGINE использовался для разработки Ryse: Son of Rome. Этот движок, как и UDK, интуитивно понятен и обладает мощными возможностями для дизайна уровней.

Несмотря на то, что CryENGINE считается самым мощным движком из всех трех, придется потратить определенное количество времени, чтобы разобраться в нем.

На сайте CryENGINE нет информации касательно лицензионных сборов, однако существует как платная, так и бесплатная версия CryENGINE.

2.2.2 Обзор средств анимации

На сегодняшний день существует множество как платных, так и бесплатных программных средств для создания 2D-анимации. Среди них выделяются такие программы как Adobe Animate, Spine и Dragon bones.

Spine - программа для создания 2D-анимации. Её ключевой особенность является возможность создания скелетной анимации, что значительно упрощает и ускоряет процесс анимирования. От разработчика требуется создать лишь несколько ключевых кадров, в отличие от Adobe Animate, где каждый кадр нужно прорисовывать вручную. Также, Spine позволяет конвертировать изображение в полигональную сетку и контролировать веса костей. Присутствует возможность экспорта данных анимации практически для всех сред создания игр, в том числе Unity и Unreal Engine.

Существует три версии программы.

Essential. Стоимость - 99$. Включает в себя основные возможности и позволяет выполнять экспорт в любой поддерживаемый формат. Каждому конкретному пользователю требуется отдельная лицензия.

Professional. Стоимость - 329$. Включает в себя все возможности и позволяет создавать более сложные анимации.

Enterprise. Стоимость - 2200$ + 295$ за пользователя. Требуется для компаний с доходом, превышающим 500000$ в год. Предоставляет все возможности продукта и позволяет использовать его определенному числу пользователей в течение года.

Dragon bones - бесплатный аналог Spine, разработанный китайскими программистами. Его функционал полностью идентичен функционалу Spine.

Adobe Animate - программное средство для покадровой отрисовки анимации. Основной его особенностью является то, что каждый кадр разработчик должен рисовать заново. Это значительно замедлит процесс разработки но даст большую свободу действий, например для создания анимированных эффектов вроде костра или дыма. Стоимость - 1288р. в месяц.

2.3 Выбор программных средств

В качестве игрового движка был выбран Unity, т.к он больше подходит для разработки мобильных 2D-игр. Кроме того, он прост в освоении, в отличие от других, представленных выше программных средств.

В качестве средства анимирования был выбран Dragon bones. В силу того, что разрабатываемое приложение является представителем Hack and slash, то необходимо создать множество анимаций ударов. Метод скелетной анимации значительно ускорит разработку. Также данное средство является бесплатным.

3. Разработка продукта

3.1 Разработка интерфейса

Игра состоит из двух сцен:

1) Главное меню;

2) Игровая сцена.

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

Эскиз сцены главного меню представлен на рисунке 1, в этой сцене реализованы следующие функции:

1) Переход на игровую сцену;

2) Демонстрация статистики.

Рисунок 1 - Эскиз главного меню

Эскиз игровой сцены представлен на рисунке 2, в этой сцене реализованы следующие функции:

1) Остановка игрового процесса (Пауза);

2) Взаимодействие пользователя с главным героем;

3) Взаимодействие главного героя с платформами;

4) Отрисовка объектов на экране;

5) Взаимодействие главного героя с противниками;

6) Взаимодействие главного героя с объектами, вызывающими смерть главного героя;

7) Меню смерти главного героя;

8) Увеличение счета на 1 при убийстве противника.

Рисунок 2 - Эскиз игровой сцены

Так же, в игре должен быть реализовано окно, всплывающее в случае смерти персонажа и предлагающее пользователю начать игру заново или вернуться в главное меню. Эскиз данного окна представлен на рисунке 3.

Рисунок 3 - Эскиз всплывающего окна

3.2 Разработка дизайна интерфейса

В соответствии с выбранным визуальным стилем игры, был разработан образ главного героя и противников. Используемые в проекте образы главного героя и противников представлены на рисунке 3 и 4 соответственно. Необходимо подчеркнуть особенность главного героя, его отличие от остальных персонажей игры. Отличает главного героя от противников наличие прически и более широкие руки и ноги. Также, главный герой использует катану в качестве оружия, тогда как противники - ятаган.

Рисунок 3 - Образ главного героя

Рисунок 4 - Образ противника

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

1) Кнопка атаки (Рисунок 5);

2) Кнопка прыжка (Рисунок 6);

3) Кнопки главного меню (Рисунок 7).

Рисунок 5 - Кнопка атаки

Рисунок 6 - Кнопка прыжка

Рисунок 7 - Кнопка главного меню

После разработки всех визуальных компонентов приложения, была создана первичная картинка интерфейса и игрового процесса, которые показаны на рисунках 8, 9 и 10.

Рисунок 8 - Первичная визуальная картинка интерфейса главного меню

Рисунок 9 - Первичная визуальная картинка интерфейса игровой сцены

Рисунок 10 - Первичная визуальная картинка всплывающего окна

3.3 Разработка приложения

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

Для реализации бесконечного уровня было принято решение использовать паттерн проектирования Object Pool. Была реализована генерация платформ с компонентом Collider, позволяющим обрабатывать столкновения с объектами. Платформы хранятся пуле объектов и в определенный момент помещаются на сцену или удаляются со сцены. Блок-схема работы данного алгоритма представлена на рисунке 11.

Рисунок 11 - Блок-схема алгоритма генерации платформ.

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

Рисунок 11 - Блок-схема алгоритма управления персонажем.

Для реализации боевой механики был разработан алгоритм, осуществляющий поиск ближайшего к персонажу объекта на определенном слое тэгом и уничтожение этого объекта. Блок-схема алгоритма представлена на рисунке 12.

Рисунок 12 - Блок-схема алгоритма поиска и уничтожения объекта.

3.3.2 Разработка игровой сцены

Для создания анимации использовался бесплатный инструментарий для создания скелетной анимации Dragon Bones. В результате были получены спрайт-листы, которые необходимо преобразовать в анимационный клип в среде Unity. Пример спрайт-листа представлен на рисунке 11.

Рисунок 11 - Спрайт-лист анимации удара

Чтобы настроить анимацию в среде Unity, был использован инструмент Animator, встроенный в среду. Данный инструмент представлен на рисунке 12.

Рисунок 12 - Инструмент Animator

В данном инструменте для перехода между анимационными клипами используются параметры. Например, для перехода из анимации бега в анимацию прыжка Animator отслеживает состояние параметра Grounded. Если Grounded становится false, то происходит переход к анимации прыжка, когда становится Grounded true - переход из анимации прыжка к анимации бега.

В среде Unity объект, управляемый игроком - персонаж, состоит из родительского объекта Player и дочерних ему объектов Char и Punch.

Управление осуществляется над объектом Player. Следовательно, этому объекту добавлены следующие компоненты:

1) Rigidbody 2D. Придает объекту физические свойства.

2) CapsuleCollider 2D. Компонент, способный отслеживать столкновение и пересечение с другими объектами сцены.

3) PlayerControler. Скрипт, дающий пользователью возможность управления персонажем. Листинг скрипта представлен в приложении 1.

Полный список компонентов объекта Player и их параметры показан на рисунке 13.

Рисунок 13 - Компоненты объекта Player

Объект Char используется для проигрывания анимации. Имеет следующие компоненты:

1) Sprite Renderer;

2) Animator. Механизм воспроизведения анимации.

Полный список компонентов объекта Player и их параметры показан на рисунке 14.

Рисунок 14 - Компоненты объекта Char

Объект Punch - пустой объект, использующийся для отслеживания точки нанесения удара.

Боевая механика реализована в скрипте Fight2D, листинг которого представлен в приложении 1. Данный скрпт содержит 2 метода:

1) NearTarget. возвращает ближайший объект в определенном радиусе от объекта Punch;

2) Action. Уничтожение объекта.

Процесс создания анимаций для противника аналогичен процессу создания анимаций главного героя. Инструментом для создания анимаций был сгенерирован спрайт-лист (Рисунок 15), в среде Unity, с помощью инструмента Animator, были установлены связи между клипами.

Рисунок 15 - Спрайт-лист анимации атаки противника

В среде Unity противник представляет из себя 2 объекта: Detection point и дочерний ему Enemy.

Detection point используется для определения позиции главного героя. Данному объекту добавлен Collider со свойством Is Trigger, которое делает коллайдер пересекаемым для других объектов и скрипт, благодаря которому осуществляется определение позиции главного героя. Когда коллайдер главного героя пересекает коллайдер Detection point, срабатывает параметр объекта Animator, присвоенного объекту Enemy, отвечающего за переход из анимации ожидания в анимацию атаки.

Объекту Enemy добавлен скрипт DieSpace, реализующий смерть главного героя при пересечении им коллайдера объекта, существующего на слое Enemy, и вызов соответствующего меню, существует на слое Enemy, поэтому, при пересечении с коллайдером Enemy коллайдера главного героя вызывается смерть главного героя, при условии, что у коллайдера включено свойство Is Trigger, иначе коллайдеры не смогут пересечься. Так же Enemy имеет компонент Animator для воспроизведения анимационных клипов. Объект появляется на сцене чуть выше уровня земли, поэтому, чтобы он не оставался висеть в воздухе, а упал на платформу, ему присвоен компонент RigidBody2D. Так как единственный коллайдер объекта имеет свойство Is Trigger, объект будет проваливаться сквозь платформу, поэтому, объекту добавлен еще один коллайдер без свойства Is Trigger, также, данный коллайдер максимально сжат, чтобы не препятствовать коллайдеру главного героя.

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

Для генерации объектов реализуются объекты для платформ и монет, расположенные на рабочей области сцены: PlatformGenerator, ObjectPool, EnemyGenerator в которых реализованы скрипты, выполняющие свой функционал.

3.3.3 Разработка меню и всплывающих окон

Главное меню состоит из текста с названием игры и двух кнопок:

1) Кнопка старта. Запускает игровую сцену.

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

Рисунок 15 - Таблица рекордов

Таблица рекордов состоит из трех текстовых полей, каждое из которых отведено под вывод счета на одном из трех уровней сложности. И кнопки возврата в главное меню. Сохранение рекордов реализовано с помощью встроенного в Unity класса PlayerPrefs, позволяющего сохранять в реестр устройства данные типа integer, float и string.

Меню выбора уровня сложности состоит из текстового поля с текстом "Chose your desteny" и трех кнопок, соответствующих одному из трех уровней сложности. При выборе уровня на игровую сцену передаются параметры игрока, соответствующие данному уровню, а именно: градация увеличения скорости передвижения и радиус атаки главного героя. Меню выбора уровня представлено на рисунке 16.

Рисунок 16 - Меню выбора уровня сложности.

Все элементы сцены главного меню управляются скриптом Menu.cs, листинг которого представлен в приложении 1.

Всплывающее окно, оповещающее о смерти главного героя состоит из текстового поля с текстом "You died..." и двух кнопок, одна из которых отвечает выполняет функцию возврата в главное меню, а другая выполняет перезапуск игровой сцены. В момент вывода этого окна на экран происходит сравнение результата текущего забега с лучшим результатом и перезапись лучшего результата. Всплывающее окно показано на рисунке 17. Листинг скрипта DeathScreen.cs, управляющий данным окном представлен в приложении 1.

Рисунок 17 - Всплывающее окно.

4. Тестирование

4.1 Обоснование методики тестирования

Тестирование продукта включает в себя несколько этапов, среди которых:

1) Модульное тестирование

Данный вид тестирования представляет собой проверку отдельных модулей продукта.

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

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

2) Функциональное тестирование

Используется для проверки работоспособности всего приложения.

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

3) Тестирование инсталляции

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

4.2 Результаты тестирования

4.2.1 Результаты модульного тестирования

Каждый модуль (скрипт) тестировался отдельно. Работоспособность модулей корректна. Были протестированы следующие модули: DeathScreen.cs, DieSpace.cs, EnemyContoler.cs, Fight2D.cs, Menu.cs, MoveCam.cs, Pause.cs, PlayerControler.cs.

4.2.2 Результаты функционального тестирования

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

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

Функциональное тестирование приведено в таблице 2.

Таблица 2 - Функциональное тестирование

Функция

Результат

Бег

При движении персонаж двигается в одном направлении с увеличивающейся скоростью.

Прыжок

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

Взаимодействие с платформой

Персонаж и платформа имеют коллизию, в связи с этим они не проходят через друг друга.

Взаимодействие с противником

Персонаж уничтожает противника, счет увеличивается на 20

Взаимодействие с объектом DieSpace

Если персонаж касается объекта, то выпадает меню смерти персонажа.

Переход на сцену главного меню

Кнопка возврата в главное меню выполняет свою функцию

Переход между экранами главного меню

Кнопки главного меню выполняют свою функцию

Переход на игровую сцену

Кнопка перехода на игровую сцену выполняет свою функцию

Генерация объектов

Объекты генерируются на протяжении всего сеанса игры на рабочей области

Уничтожение объектов

Объекты уничтожаются за пределами видимости пользователя.

4.2.3 Результаты тестирования инсталляции

Тестирование было проведено на нескольких мобильных устройствах, которые имеют соответствующие технические характеристики:

1) Oukitel K4000

2) Huawei honor 5a

3) Blackview BV5000

4) ZTE Blade x7

На каждом из устройств приложение работало корректно, установка и удаление не вызвала проблем.

Заключение

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

Было определено основное программное обеспечение, необходимое для разработки проекта.

Цель разработки - создание игрового приложения на базе ОС Android - была достигнута.

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

Разработанный продукт успешно прошел тестирование, мелкие недочеты исправлены, крупных не обнаружено.

Список использованных источников

1. Геймплей [Электронный ресурс]: Википедия / Геймплей - Режим доступа: https://ru.wikipedia.org/wiki/ Геймплей

2. Игровой движок [Электронный ресурс]: Википедия / Игровой движок - Режим доступа: https://ru.wikipedia.org/wiki/Игровой_движок

3. Графический движок [Электронный ресурс]: Википедия / Графический движок - Режим доступа: https://ru.wikipedia.org/wiki/ Графический_движок

4. Физический движок [Электронный ресурс]: Википедия / Физический движок - Режим доступа: https://ru.wikipedia.org/wiki/ Физический _движок

5. Сценарный язык [Электронный ресурс]: Википедия / Сценарный язык - Режим доступа: https://ru.wikipedia.org/wiki/ Сценарный_язык

6. JIT-компиляция [Электронный ресурс]: Википедия / JIT-компиляция - Режим доступа: https://ru.wikipedia.org/wiki/ JIT-компиляция

7. Спрайт [Электронный ресурс]: Википедия / Спрайт - Режим доступа: https://ru.wikipedia.org/wiki/ Спрайт_(компьютерная_графика)

8. Полигональная сетка [Электронный ресурс]: Википедия / Полигональная сетка - Режим доступа: https://ru.wikipedia.org/wiki/ Полигональная_сетка

9. Справка по Unity [Электронный ресурс]: Руководство по Unity/Cправка по Uniy - Режим доступа: http://unity.ogf.su/Documentation/Manual/

10. Руководство Unity [Электронный ресурс]: Unity-Руководство / Руководство по Unity- Режим доступа: http://docs.unity3d.com/ru/current/Manual/

11. Бейзер, Б. Тестирование черного ящика: технологии функционального тестирования программного обеспечения и систем / Б. Бейзер. - СПб.: Питер, 2004 . - 317 с.

Приложение 1.

(обязательное)

Листиги скриптов проекта

1) MoveCam.cs

using UnityEngine;

public class MoveCam : MonoBehaviour {

public GameObject Player;

public float xPos;

public float yPos;

void Update () {

transform.position = new Vector3 (Player.transform.position.x + xPos, yPos, -10f);

}

}

2) PlayerControler.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class PlayerControler : MonoBehaviour {

public float mSpeed = 20f;

public float Haste = 20f;

public float jumpForce = 8000f;

private Rigidbody2D rb;

private Animator mAnimator;

public bool Grounded;

public bool LetStart;

private Collider2D mCollider;

public LayerMask whatIsGround;

public int Weapon;

public Transform Punch;

public float PunchRadius;

public int Score;

public Timer timer;

void Start () {

rb = GetComponent <Rigidbody2D> ();

mAnimator = gameObject.GetComponentInChildren<Animator> ();

mCollider = GetComponent<Collider2D> ();

LetStart = false;

Score = 0;

}

void Update () {

Grounded = Physics2D.IsTouchingLayers (mCollider, whatIsGround);

if (timer.Timer1 >=3) {

Move ();

mAnimator.SetFloat ("Speed", rb.velocity.x);

mAnimator.SetBool ("Grounded", Grounded);

//mAnimator.SetInteger ("Weapon", Weapon);

}

}

public void Jump(bool isJump){

isJump = Grounded;

if (Grounded) {

rb.velocity = new Vector2 (rb.velocity.x, jumpForce);

}

}

void Move(){

rb.velocity = new Vector2 (mSpeed, rb.velocity.y);

}

public void Hit(){

mAnimator.PlayInFixedTime("HitWithSword");

Fight2D.Action (Punch.position, PunchRadius, 8);

Score = Score+1;

}

}

3) DieSpace.cs

using UnityEngine;

public class DieSpace : MonoBehaviour {

public GameObject respawn;

public GameObject DeathMenu;

public PlayerControler thePlayer;

void OnTriggerEnter2D(Collider2D other){

if (other.tag == "Player") {

Time.timeScale = 0;

PlayerPrefs.SetInt (Global.Mode, thePlayer.Score);

DeathMenu.gameObject.SetActive (true);

}

}

}

4) Menu.cs

using System.Collections;

using UnityEngine;

using UnityEngine.UI;

public class Menu : MonoBehaviour {

public string playGame;

public PlayerControler tp;

public GameObject MainMenu;

public GameObject StatsMenu;

public Text EazyText;

public Text NormalText;

public Text HardText;

public int EazyScore;

public int NormalScore;

public int HardScore;

public void PlayGame(){

Global.Mode = "Normal";

Application.LoadLevel(playGame);

}

public void showStats(){

EazyScore = PlayerPrefs.GetInt ("Easy");

EazyText.text = ""+EazyScore;

MainMenu.gameObject.SetActive (false);

StatsMenu.gameObject.SetActive (true);

}

public void showMenu(){

MainMenu.gameObject.SetActive (true);

StatsMenu.gameObject.SetActive (false);

}

}

5) DeathScreen.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class DeathScreen : MonoBehaviour {

public void RestartLevel () {

Application.LoadLevel ("Scene");

Time.timeScale = 1;

}

public void BackToMenu(){

Application.LoadLevel ("Menu");

Time.timeScale = 1;

}

}

6) Pause.cs

using System.Collections;

using UnityEngine;

using UnityEngine.UI;

public class Pause : MonoBehaviour {

public bool paused = false;

public GameObject pauseMenu;

public Timer timer;

public void PauseGame (){

if (!paused) {

Time.timeScale = 0;

pauseMenu.SetActive (true);

paused = true;

} else {

pauseMenu.SetActive (false);

Time.timeScale = 1;

paused = false;

}

}

}

7) Timer.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Timer : MonoBehaviour {

public float Timer1;

void Update(){

Timer1 += Time.deltaTime;

if (Timer1 >= 4)

ZeroTimer ();

}

public void ZeroTimer(){

Timer1 = 0;

}

}

8) Fight2D.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Fight2D : MonoBehaviour {

static GameObject NearTarget(Vector3 position, Collider2D[] array){

Collider2D currrent = null;

float dist = Mathf.Infinity;

foreach (Collider2D coll in array) {

float curDist = Vector3.Distance (position, coll.transform.position);

if (curDist < dist) {

currrent = coll;

dist = curDist;

}

}

return currrent.gameObject;

}

//point - точка контакта

//radius - радиус поражения

//layerMask - номер слоя

public static void Action(Vector2 point, float radius, int layerMask){

Collider2D[] colliders = Physics2D.OverlapCircleAll (point, radius, 1"layerMask);

GameObject obj = NearTarget (point, colliders);

GameObject.Destroy (obj);

}

}

9) Global.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Global : MonoBehaviour {

public static string Mode = "Normal";

public static float PunchRadius = 2;

public static float maxSpeed = 20f;

}

10) PlatformGenerator.cs

using UnityEngine;

using System.Collections;

public class PlatformGenerator : MonoBehaviour {

public GameObject thePlatform;

public Transform generationPoint;

public float distannceBetween;

private float platformWidth;

public float distanceBetweenMin;

public float distanceBetweenMax;

private int platformSelector;

private float[] platformWidths;

public ObjectPooler[] theObjectPools;

public EnemyGenerator theEnemyGenerator;

public float RandomCoinThreshold;

void Start () {

platformWidths = new float[theObjectPools.Length];

for (int i = 0; i < theObjectPools.Length; i++)

{

platformWidths[i] = theObjectPools[i].pooledObject.GetComponent<BoxCollider2D> ().size.x;

}

theEnemyGenerator = FindObjectOfType<EnemyGenerator> ();

}

void Update () {

if (transform.position.x < generationPoint.position.x) {

distannceBetween = Random.Range (distanceBetweenMin, distanceBetweenMax);

platformSelector = Random.Range(0, theObjectPools.Length);

transform.position = new Vector3(transform.position.x + (platformWidths[platformSelector]/2) + distannceBetween, transform.position.y, transform.position.z);

GameObject newPlatform = theObjectPools[platformSelector].GetPooledObject();

newPlatform.transform.position = transform.position;

newPlatform.transform.rotation = transform.rotation;

newPlatform.SetActive (true);

if (Random.Range (0f, 100F) < RandomCoinThreshold) {

theEnemyGenerator.SpawnEnemyes (new Vector3 (transform.position.x, transform.position.y + 1f, transform.position.z));

}

transform.position = new Vector3(transform.position.x + (platformWidths[platformSelector]/2), transform.position.y, transform.position.z);

}

}

}

11) ObjectPooler.cs

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class ObjectPooler : MonoBehaviour {

public GameObject pooledObject;

public int pooledAmount;

List<GameObject> pooledObjects;

void Start () {

pooledObjects = new List<GameObject>();

for (int i = 0; i < pooledAmount; i++)

{

GameObject obj = (GameObject)Instantiate(pooledObject);

obj.SetActive (false);

pooledObjects.Add (obj);

}

}

public GameObject GetPooledObject()

{

for (int i = 0; i < pooledObjects.Count; i++)

{

if (!pooledObjects[i].activeInHierarchy)

{

return pooledObjects[i];

}

}

GameObject obj = (GameObject)Instantiate(pooledObject);

obj.SetActive (false);

pooledObjects.Add (obj);

return obj;

}

}

12) PlatformDestruction.cs

using UnityEngine;

using System.Collections;

public class PlatformDestruction : MonoBehaviour {

public GameObject platformDestructionPoint;

void Start () {

platformDestructionPoint = GameObject.Find ("PlatformDestructionPoint");

}

void Update () {

if (transform.position.x < platformDestructionPoint.transform.position.x)

{

gameObject.SetActive(false);

}

}

}

13) EnemyManager.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class EnemyManager : MonoBehaviour {

public ObjectPooler enemyPool;

public float distanceBetveenEnemies;

public void SpawnEnemies (Vector3 startPosttion)

{

GameObject enemy1 = enemyPool.GetPooledObject ();

enemy1.transform.position = startPosttion;

enemy1.SetActive (true);

GameObject enemy2 = enemyPool.GetPooledObject ();

enemy2.transform.position = new Vector3(startPosttion.x - distanceBetveenEnemies, startPosttion.y, startPosttion.z);

enemy2.SetActive (true);

GameObject enemy3 = enemyPool.GetPooledObject ();

enemy3.transform.position = new Vector3(startPosttion.x + distanceBetveenEnemies, startPosttion.y, startPosttion.z);

enemy3.SetActive (true);

}

}

Размещено на Allbest.ru


Подобные документы

  • Разработка клиент-серверного игрового приложения на примере игры в шашки для мобильных устройств на базе операционной системы Android. Обзор мобильных платформ. Экраны приложения и их взаимодействие. Графический интерфейс, руководство пользователя.

    курсовая работа [2,6 M], добавлен 15.06.2013

  • Общие характеристики операционной системы Android. Разработка приложения на основе создания менеджера файлов. Получение с помощью приложения доступа к файлам, хранящимся в "облачном хранилище" в сети Интернет. Расчет стоимости программного обеспечения.

    дипломная работа [2,7 M], добавлен 03.04.2015

  • Современное состояние рынка мобильных приложений. Основные подходы к разработке мобильных приложений. Обоснование выбора целевой группы потребителей приложения. Этапы проектирования и разработки мобильного приложения для операционной системы Android.

    курсовая работа [987,1 K], добавлен 27.06.2019

  • Анализ свободно распространяемых систем обучения. Главная контекстная диаграмма (модель AS-IS). Декомпозиция процесса "Регистрация, поддержка пользователей". Выбор методологий моделирования и инструментария. Руководство по установке приложения на Android.

    дипломная работа [2,1 M], добавлен 29.07.2016

  • Архитектура и история создания операционной системы Android. Язык программирования Java. Выбор средства для реализации Android приложения. Программная реализация Android приложения. Проведение тестирования разработанного программного обеспечения.

    курсовая работа [167,8 K], добавлен 18.01.2017

  • Первое устройство, работающее под управлением Android. Приложения под операционную систему Android. Формат установочных пакетов. Разработка приложений на языке Java. Шаблоны основных пакетов и компонентов Android. Сборка приложений, основанная на Gradle.

    курсовая работа [492,0 K], добавлен 08.02.2016

  • Архитектура операционной системы Android, набор библиотек для обеспечения базового функционала приложений и виртуальная машина Dalvik. Объектно-ориентированный язык программирования Java как инструмент разработки мобильных приложений для ОС Android.

    дипломная работа [1,6 M], добавлен 08.07.2015

  • Google Android как программный стек для мобильных устройств, который включает операционную систему, программное обеспечение промежуточного слоя и пользовательские приложения. Структура платформы и ее основные элементы: ядро, программы, каркас приложений.

    реферат [600,4 K], добавлен 08.01.2015

  • Разработка городских систем на базе мобильных интерфейсов. Методики геокодирования в информационных системах, ориентированных на определенную группу пользователей. Прототипная реализация туристической карты для мобильных устройств на платформе Android.

    дипломная работа [4,3 M], добавлен 05.12.2013

  • Разработка приложений для смартфонов на ОС Android для сети аптек "Фармация". Архитектура операционной системы Android. Архитектура и реализация приложения. Его функциональность. Описание работы мобильного приложения. Расчет затрат на создание продукта.

    дипломная работа [1,6 M], добавлен 17.06.2017

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.