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

Тип:
Добавлен:

Содержание

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Приложения

Введение

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

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

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

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 RunSubway SurfersJetpack JoyrideВид3D3D2DРазработчикImangi StudiosKiloo и SYBO GamesHalfbrick StudiosПлатформыiOS, Android, Windows PhoneiOS, Android, Windows Phone, WindowsiOS, Flash, Android, PlayStation Network, Windows Phone 8, Windows 8ЛицензияFreemiumFreemiumFreemiumУправлениеСенсорный экранСенсорный экранСенсорный экранДата выпуска4 августа 201124 мая 20121 сентября 2011

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

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

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

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

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

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

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

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

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

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

На сегодняшний день существуют 3 наиболее популярных и конкурирующих между собой движка для разработки игр - Unity, UDK и Cry ENGINE.- игровой движок с широким спектром возможностей, удобным и дружественно настроенным интерфейсом. Его основной плюс - мультиплатформенность, что означает легкое и быстрое портирование проектов под такие платформы, как 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 снабжает контент вотермарками, избавиться от которых весьма проблематично.Development Kit или UDK - бесплатная версия движка Unreal Engine 3, написанного Epic Games, который используется для разработки многих игр. Этот движок обладает высокими графическими возможностями и может также использоваться для разработки мобильных игр. У UDK, в отличие от Unity, есть свой собственный мощный инструмент для дизайна игровых уровней непосредственно в самом движке.

Главным образом, Unreal Engine разрабатывался для создания FPS. У Unreal есть собственный объектно-ориентированный язык программирования для написания скриптов, похожий на Java или C++., как и Unity, работает с различными платформами, включая iOS, Android, Windows Phone 8, Xbox360, PS 3, Playstation Vita и Wii U.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

) Sprite Renderer;

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

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

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

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

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

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

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

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

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

В среде Unity противник представляет из себя 2 объекта: Detection point и дочерний ему Enemy.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 Разработка меню и всплывающих окон

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.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 Результаты тестирования инсталляции

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

)Oukitel K4000

2)Huawei honor 5a

3)Blackview BV5000

4)ZTE Blade x7

Заключение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

. Справка по Unity [Электронный ресурс]: Руководство по Unity/Cправка по Uniy - Режим доступа: #"justify">Приложение 1.

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

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

) MoveCam.cs

using UnityEngine;class MoveCam : MonoBehaviour {GameObject Player;float xPos;float yPos;Update () {.position = new Vector3 (Player.transform.position.x + xPos, yPos, -10f);

}

}

) PlayerControler.csSystem.Collections;System.Collections.Generic;UnityEngine;class PlayerControler : MonoBehaviour {float mSpeed = 20f;float Haste = 20f;float jumpForce = 8000f;Rigidbody2D rb;Animator mAnimator;bool Grounded;bool LetStart;Collider2D mCollider;LayerMask whatIsGround;int Weapon;Transform Punch;float PunchRadius;int Score;Timer timer;Start () {= GetComponent <Rigidbody2D> ();= gameObject.GetComponentInChildren<Animator> ();= GetComponent<Collider2D> ();= false;= 0;

}Update () {= Physics2D.IsTouchingLayers (mCollider, whatIsGround);(timer.Timer1 >=3) {();.SetFloat ("Speed", rb.velocity.x);.SetBool ("Grounded", Grounded);

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

}

}void Jump(bool isJump){= Grounded;(Grounded) {.velocity = new Vector2 (rb.velocity.x, jumpForce);

}

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

}void Hit(){.PlayInFixedTime("HitWithSword");D.Action (Punch.position, PunchRadius, 8);= Score+1;

}

}

) DieSpace.csUnityEngine;class DieSpace : MonoBehaviour {GameObject respawn;GameObject DeathMenu;PlayerControler thePlayer;OnTriggerEnter2D(Collider2D other){(other.tag == "Player") {.timeScale = 0;.SetInt (Global.Mode, thePlayer.Score);.gameObject.SetActive (true);

}

}

}

) Menu.csSystem.Collections;UnityEngine;UnityEngine.UI;class Menu : MonoBehaviour {string playGame;PlayerControler tp;GameObject MainMenu;GameObject StatsMenu;Text EazyText;Text NormalText;Text HardText;int EazyScore;int NormalScore;int HardScore;void PlayGame(){.Mode = "Normal";.LoadLevel(playGame);

}void showStats(){= PlayerPrefs.GetInt ("Easy");.text = ""+EazyScore;.gameObject.SetActive (false);.gameObject.SetActive (true);

}void showMenu(){.gameObject.SetActive (true);.gameObject.SetActive (false);

}

}

) DeathScreen.csSystem.Collections;System.Collections.Generic;UnityEngine;class DeathScreen : MonoBehaviour {

void RestartLevel () {.LoadLevel ("Scene");.timeScale = 1;

}void BackToMenu(){.LoadLevel ("Menu");.timeScale = 1;

}

}

) Pause.csSystem.Collections;UnityEngine;UnityEngine.UI;class Pause : MonoBehaviour {bool paused = false;GameObject pauseMenu;Timer timer;void PauseGame (){(!paused) {.timeScale = 0;.SetActive (true);= true;

} else {.SetActive (false);.timeScale = 1;= false;

}

}

}

) Timer.csSystem.Collections;System.Collections.Generic;UnityEngine;class Timer : MonoBehaviour {float Timer1;Update(){+= Time.deltaTime;(Timer1 >= 4)();

}void ZeroTimer(){= 0;

}

}

) Fight2D.csSystem.Collections;System.Collections.Generic;UnityEngine;class Fight2D : MonoBehaviour {GameObject NearTarget(Vector3 position, Collider2D[] array){D currrent = null;dist = Mathf.Infinity;(Collider2D coll in array) {curDist = Vector3.Distance (position, coll.transform.position);(curDist < dist) {= coll;= curDist;

}

}currrent.gameObject;

}

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

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

//layerMask - номер слояstatic void Action(Vector2 point, float radius, int layerMask){D[] colliders = Physics2D.OverlapCircleAll (point, radius, 1"layerMask);obj = NearTarget (point, colliders);.Destroy (obj);

}

}

) Global.csSystem.Collections;System.Collections.Generic;UnityEngine;class Global : MonoBehaviour {static string Mode = "Normal";static float PunchRadius = 2;static float maxSpeed = 20f;

}

) PlatformGenerator.csUnityEngine;System.Collections;class PlatformGenerator : MonoBehaviour {GameObject thePlatform;Transform generationPoint;float distannceBetween;float platformWidth;float distanceBetweenMin;float distanceBetweenMax;int platformSelector;float[] platformWidths;ObjectPooler[] theObjectPools;EnemyGenerator theEnemyGenerator;float RandomCoinThreshold;Start () {= new float[theObjectPools.Length];(int i = 0; i < theObjectPools.Length; i++)

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

}= FindObjectOfType<EnemyGenerator> ();

}Update () {(transform.position.x < generationPoint.position.x) {= Random.Range (distanceBetweenMin, distanceBetweenMax);= Random.Range(0, theObjectPools.Length);.position = new Vector3(transform.position.x + (platformWidths[platformSelector]/2) + distannceBetween, transform.position.y, transform.position.z);newPlatform = theObjectPools[platformSelector].GetPooledObject();.transform.position = transform.position;.transform.rotation = transform.rotation;.SetActive (true);(Random.Range (0f, 100F) < RandomCoinThreshold) {.SpawnEnemyes (new Vector3 (transform.position.x, transform.position.y + 1f, transform.position.z));

}

}

}

) ObjectPooler.csUnityEngine;System.Collections;System.Collections.Generic;class ObjectPooler : MonoBehaviour {GameObject pooledObject;int pooledAmount;<GameObject> pooledObjects;Start () {= new List<GameObject>();(int i = 0; i < pooledAmount; i++)

{obj = (GameObject)Instantiate(pooledObject);.SetActive (false);.Add (obj);

}

} GameObject GetPooledObject()

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

{(!pooledObjects[i].activeInHierarchy)

{pooledObjects[i];

}

}obj = (GameObject)Instantiate(pooledObject);.SetActive (false);.Add (obj);obj;

}

}

) PlatformDestruction.csUnityEngine;System.Collections;class PlatformDestruction : MonoBehaviour {GameObject platformDestructionPoint;Start () {= GameObject.Find ("PlatformDestructionPoint");

}Update () {(transform.position.x < platformDestructionPoint.transform.position.x)

{.SetActive(false);

}

}

}

) EnemyManager.csSystem.Collections;System.Collections.Generic;UnityEngine;class EnemyManager : MonoBehaviour {ObjectPooler enemyPool;float distanceBetveenEnemies;void SpawnEnemies (Vector3 startPosttion)

{enemy1 = enemyPool.GetPooledObject ();.transform.position = startPosttion;.SetActive (true);enemy2 = enemyPool.GetPooledObject ();.transform.position = new Vector3(startPosttion.x - distanceBetveenEnemies, startPosttion.y, startPosttion.z);.SetActive (true);enemy3 = enemyPool.GetPooledObject ();.transform.position = new Vector3(startPosttion.x + distanceBetveenEnemies, startPosttion.y, startPosttion.z);.SetActive (true);

}

}

Copyright © 2018 WorldReferat.ru All rights reserved.