close

Вход

Забыли?

вход по аккаунту

Видулина Татьяна Анатольевна. Разработка обучающей программы «Развитие пространственного мышления с помощью теневых проекций»

код для вставки
Powered by TCPDF (www.tcpdf.org)
Powered by TCPDF (www.tcpdf.org)
АННОТАЦИЯ
ВКР 69 с., 29 рис., 1 табл., 10 источников, 1 прил.
ANDROID-ПРИЛОЖЕНИЕ, ПРОСТРАНСТВЕННОЕ МЫШЛЕНИЕ,
ТЕНЕВЫЕ ПРОЕКЦИИ, ТРЕНАЖЕР.
Выпускная квалификационная работа посвящена разработке Androidприложения для развития пространственного мышления с помощью теневых
проекций.
В первой главе приведено описание задачи развития пространственного
мышления. Перечислены и проанализированы аналогичные решения.
Выявлены функциональные и нефункциональные требования к системе.
Во второй главе проведено моделирование предметной области. Были
составлены такие диаграммы, как диаграмма вариантов использования,
диаграмма классов и диаграмма состояний.
В
третьей
главе
были
спроектированы
основные
алгоритмы
приложения и пользовательский интерфейс.
В четвертой главе был произведен обзор программных средств
разработки, описана реализация приложения для развития пространственного
мышления с помощью теневых проекций, представлены особенности
реализации классов.
Графическая часть выпускной квалификационной работы включает
иллюстрации, таблицы, которые объединены в презентацию PowerPoint.
Библиографическая
часть
включает в себя 10 источников.
выпускной
квалификационной
работы
4
СОДЕРЖАНИЕ
ВВЕДЕНИЕ
5
1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ И ОБЗОР ПРОГРАММНЫХ
СРЕДСТВ РАЗРАБОТКИ
7
1.1 Анализ задачи
7
1.2 Обзор приложений-аналогов
9
1.3 Требования к разрабатываемому приложению
13
2 МОДЕЛИРОВАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ
15
2.1 Диаграмма вариантов использования
15
2.2 Диаграмма классов
17
2.3 Диаграмма состояний
22
3 ПРОЕКТИРОВАНИЕ
26
3.1 Частные алгоритмы
26
3.2 Пользовательский интерфейс
31
4 РЕАЛИЗАЦИЯ
36
4.1 Обзор программных средств разработки
36
4.2 Реализация компонентов программы
38
4.3 Реализация приложения
41
ЗАКЛЮЧЕНИЕ
50
СПИСОК ЛИТЕРАТУРЫ
51
ПРИЛОЖЕНИЕ А – ЛИСТИНГ ПРОГРАММЫ
52
УДОСТОВЕРЯЮЩИЙ ЛИСТ
67
ИНФОРМАЦИОННО-ПОИСКОВАЯ ХАРАКТЕРИСТИКА
ДОКУМЕНТА НА ЭЛЕКТРОННОМ НОСИТЕЛЕ
68
5
ВВЕДЕНИЕ
Современный человек стремится достичь наибольшего удобства в
каждой из сфер жизни. В настоящее время трудно представить себе жизнь
без мобильного телефона, смартфона, планшетного компьютера, другого
мультимедийного устройства. Эти устройства всегда с нами, ими удобно
пользоваться, и они являются не только средством общения, но имеют
большое количество полезных функций, таких как калькулятор, органайзер,
конвертер, календарь, часы. Мобильные устройства стали выполнять
широкий
спектр
функциональность
вычислительных
достигли
столь
задач.
Их
высокого
эффективность
уровня
и
благодаря
установленным специализированным приложениям, которые разнообразны
по своему назначению.
Все основные приложения делятся на те, которые предназначены для
приятного времяпрепровождения, и те, которыми пользуются исключительно
в рабочих целях. Первая группа включает в себя игры и развлекательные
программы, софт для воспроизведения видео и аудио материалов, средства
для коммуникации. Второе направление рассчитано на комплексное решение
определенного задания.
В настоящее время рынок мобильных игр не стоит на месте и активно
развивается. Если пару лет назад этот рынок был догоняющим, то сейчас он
стал самым прибыльным рынком всей мировой игровой индустрии, обогнав
игры для персональных компьютеров, Mac и консолей. Ежемесячно в
магазинах приложений App Store и Google Play появляются десятки тысяч
новых игр.
Широкое распространение игр и развитие Интернета привели к
возникновению
геймификации
как
новой
формы
обучения
и
профессиональной подготовки. Геймификация – это способ воздействия на
обучающихся. Идея геймификации состоит в использовании игрового
подхода для того, чтобы сделать преподавание и обучение более
6
занимательными, так как в играх приобретается необходимый опыт,
устанавливаются
безопасные
границы,
в
пределах
которых
можно
исследовать явления, обдумывать их и практиковаться, не боясь совершать
ошибки, так как всегда можно победить в следующей игре. Игра – идеальная
обучающая среда со встроенным разрешением на ошибку. В электронном
образовании игры могут заменить типовые задания, а при традиционном
обучении разнообразить сложившийся формат занятий. Настоящая ценность
геймификации состоит в том, чтобы игровой принцип способствовал
созданию осмысленного учебного опыта.
Игровые приложения становятся более убедительными и наглядными,
если в них будут построены тени при существующем в действительности
освещении. Однако тени могут не только улучшить восприятие приложения,
но и могут играть главную роль в игровом процессе.
Когда на объект попадает свет, то падающая тень этого объекта под
разными углами может напоминать совсем иной предмет. Благодаря этому,
можно развивать пространственное мышление, путем складывания теней от
нескольких объектов в изображение новой фигуры.
Целью дипломной работы является создание Android-приложения для
развития пространственного мышления с помощью теневых проекций.
Для достижения поставленной цели необходимо решить следующие
задачи:
1) провести анализ предметной области и обзор программных средств
разработки;
2) провести моделирование предметной области;
3) спроектировать Android-приложение;
4) реализовать Android-приложение.
7
1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ И ОБЗОР ПРОГРАММНЫХ
СРЕДСТВ РАЗРАБОТКИ
1.1 Анализ задачи
Пространственное мышление – является весомым составляющим
интеллекта. Представляет собой вид мыслительной деятельности, в ходе
которого
формируются
пространственные
образы
и
происходит
оперирование ими для решения задач. Другими словами, это способность
человека представить объект во всех его деталях и проявлениях и каким-либо
образом трансформировать этот объект.
С развитым пространственным мышлением становится гораздо легче
читать чертежи и карты, определять местонахождение и представлять схему
движения к цели.
Пространственное мышление развивается с раннего детства, когда
ребенок начинает совершать свои первые действия. Его формирование
происходит в несколько этапов и заканчивается, примерно, в подростковом
возрасте. Однако его доразвитие и преобразование возможно в течение
жизни.
Выделяют три типа оперирования пространственными образами.
1) Изменение пространственного положения образа. Человек мысленно
может передвинуть объект без каких-либо изменений его внешнего вида.
Например, передвижения согласно карте, мысленное переставление объектов
в комнате, перечерчивание и т.д.
2) Изменение структуры образа. Человек может мысленно каким-либо
образом изменить объект, но при этом он остается неподвижным. Например,
мысленное добавление одной фигуры к другой и их объединение,
представление того, как будет выглядеть объект, если добавить к нему
деталь, и пр.
3) Одновременное изменение и положения, и структуры образа.
Человек способен одновременно представить изменения во внешнем облике
8
и пространственном положении предмета. Например, мысленное вращение
объемной фигуры с разными сторонами, представление о том, как будет
выглядеть такая фигура с той или другой стороны, и другое [3].
Однако, экспериментальные исследования показывают, что одни и те
же люди с легкостью решают одни задачи и совсем не решают другие,
относящиеся к одному и тому же типу оперирования. Это является основой
индивидуальных различий в развитии пространственного мышления.
Способы
оперирования
пространственным
образом
–
способы
осуществления преобразований:
1) отражение образа по отдельным его элементам с последующим их
объединением;
2) совершение преобразований над одним элементом образа с
дальнейшим его достраиванием;
3) способ – изначальное оперирование только одним элементом с
дальнейшим моментальным получением требуемого образа;
4) способ – оперирование сразу всем образом [2].
Характеристика пространственного интеллекта включает в себя
несколько этапов, имеющих ряд специфических особенностей:
1) анализ – разделение объекта или задачи на составляющие его части.
2) синтез – обратный анализу процесс – соединение объекта или задачи
в единое целое.
3) абстрагирование – определение нескольких этапов задания, которые
должны быть в нем. На этом этапе происходит формирование понятий.
4) обобщение – определение и выделение значимых частей объекта или
предмета, которые нужно сравнить между собой.
5) конкретизация – обратный процесс обобщения – выделение
характерных заданию этапов, не связанных с этапами решений.
Многочисленные
исследования
показали,
что
интеллектуальное
развитие и становление личности неразрывно связано с познанием
пространства сначала практически, а затем и теоретически. Само развитие
9
овладения пространством понимается при этом, как усложнение и
качественное изменение видов и способов ориентации. Важной стороной
интеллектуального
развития
является
пространственное
мышление,
обеспечивающее входе познания выделение в объектах и явлениях
действительности
пространственных
свойств
и
отношений
(формы,
величины, направления, протяженности и т.п.), создание на этой основе
пространственных образов и оперирование ими в процессе решения задач.
Трудно назвать хотя бы одну область человеческой деятельности, где
создание пространственных образов и оперирование ими не играло
существенной роли. Особое значение пространственное мышление имеет в
различных видах конструктивно-технической, изобразительной, графической
деятельности.
Из всего выше сказанного вытекает вывод о том, пространственное
мышление – важный познавательный психический процесс, определяющий
развитие
интеллекта.
Его
формирование
проходит
длительный
многоступенчатый путь, успех которого зависит от реализации учителем
дидактического правила постепенного и последовательного усложнения типа
оперирования пространственным образом.
1.2 Обзор приложений-аналогов
В настоящее время на основных площадках, таких как Google Play и
App Store, находится много игр в жанрах «Головоломка», «Игры для ума» и
«Образование». Рассмотрим наиболее популярные игровые приложения в
данных жанрах, чтобы определить какие игровые особенности сейчас
популярны и выявить недостатки этих игр. Это позволит избежать ошибок и
спроектировать тренажер с наиболее интересным игровым процессом.
1)
Shadowmatic – игра сочетающая такие жанры, как «Головоломка»
и «Игры для ума». Является одной из самых популярных игр в жанрах
«Головоломка» и «Игры для ума». Shadowmatic –трехмерная головоломка. В
10
игре необходимо вращать различные объекты под различными ракурсами и
градусами, пока те не отбросят на стену правильную тень, отображающую
задумку разработчиков. Пример работы приложения представлен на рисунке
1.2.1.
Рисунок 1.2.1 – Работа приложения «Shadowmatic»
Недостатками являются отсутствие редактора уровней и наличие
только платной версии приложения.
2) Тренировка пространственного
мышления
– игра в жанре
«Образование». За ограниченное время необходимо собрать паттерны из
клеточек так, чтобы они соответствовали образцу. Фигуры составляются
подсвеченными клеточками на поле 3х3. Образец может быть повернут на 90
или 180 градусов. В игре есть дополнительные трудные режимы: "Death"
(первая неправильно выделенная клетка сразу ведет к проигрышу), "Mirror"
(паттерны нужно собирать отраженные по сравнению с примером). Пример
работы приложения представлен на рисунке 1.2.2.
11
Рисунок 1.2.2 – Пример работы приложения «Тренировка пространственного
мышления»
Недостатками приложения являются отсутствие возможности выбрать
размер поля в любом режиме игры, а также выбрать угол отражения в
режиме «Mirror». Еще один недостаток – небольшое количество уровней.
3) Blek – игра в жанре «Головоломки». Цель игры проста: надо
провести линию, которая пройдет через все цветные круги, не зацепив
черные. Чтобы сделать это, необходимо нарисовать линию или штрих. В
конце штриха, который нарисовал пользователь, приложение начнет
воспроизводить все движения, которые игрок выполнил ранее, до границы
экрана. Линии, которые соприкасаются с верхней или нижней границей
экрана, сбрасывают уровень, а линии, которые соприкасаются слева или
справа с экраном, отражаются. Помимо того, что рисунок штриха
пользователя
повторяется,
приложение
имитирует
темп
игрока
при
12
рисовании штриха. Положительная сторона заключается в том, что есть не
единственное правильное решение для завершения уровня, а несколько
способов
закончить
его,
и
единственным
ограничением
является
воображение и художественные способности игрока.
Пример работы приложения представлен на рисунке 1.2.3.
Рисунок 1.2.3 – Пример работы приложения «Blek»
Недостатки приложения – отсутствие списка уровней. Один и тот же
уровень не получится пройти несколько раз. Также недостатком является то,
что приложение платное.
Все рассмотренные игры являются лидерами рейтингов в магазинах
приложений App Store и Google Play и занимают лидирующие позиции в
своих категориях уже долгое время. Также эти игры сочетают несколько
жанров или игровых механик, поэтому это доказывает, что сочетать разные
жанры и игровые механики необходимо, чтобы игра стала популярной,
благодаря новизне. Именно сочетанием разных жанров создаются новые
типы игр в своих категориях.
13
Сравнение приложений представлено на таблице 1.2.1.
Таблица 1.2.1 – Сравнение приложений
Критерий
Разрабаты-
Shadowmatic
Тренировка
ваемое
пространст-
приложение
венного
Приложение
Blek
мышления
Цена
Бесплатно
Платно
Бесплатно
Платно
Редактор
Есть
Нет
Нет
Нет
Список уровней
Есть
Есть
Нет
Нет
Статистика
Есть
Есть
Нет
Нет
уровней
пользователя
Из представленной таблицы следует, что основной функцией,
обуславливающей актуальность разрабатываемого приложения, является
«Редактор уровней», в котором пользователю будет доступно создавать,
редактировать и удалять уровни.
1.3 Требования к разрабатываемому приложению
Требование можно определить, как подробное описание того, что
должно быть реализовано. Существует два основных типа требований:
– функциональные требования – какое поведение должна предлагать
система;
– нефункциональные требования – особое свойство или ограничение,
накладываемое на систему.
В
результате
были
выявлены
основные
функциональные
и
нефункциональные требования к создаваемому мобильному приложению:
1) приложение должно работать в двух режимах: режиме тренировки и
в режиме редактора уровней;
14
2) при запуске игрового приложения должно появиться главное меню,
где можно будет выбрать режим работы приложения;
3) пользователь имеет возможность создавать новые уровни;
4) приложение должно сохранять созданные уровни;
5) приложение должно сохранять статистику игрока;
6) приложение должно функционировать на операционной системе
Android с версии не ниже 4.0.
15
2 МОДЕЛИРОВАНИЕ ПРЕДМЕТНОЙ ОБЛАСТИ
2.1 Диаграмма вариантов использования
Диаграммы вариантов использования описывают взаимоотношения и
зависимости между группами вариантов использования и действующих лиц,
участвующими в процессе [4].
Создание диаграммы вариантов использования имеет следующие цели:
1) определить общие границы и контекст моделируемой предметной
области на начальных этапах проектирования системы;
2) сформулировать общие требования к функциональному поведению
проектируемой системы;
3) разработать исходную концептуальную модель системы для ее
последующей детализации в форме логических и физических моделей;
4) подготовить
исходную
документацию
для
взаимодействия
разработчиков системы с ее заказчиками и пользователями.
Назначение диаграммы вариантов использования заключается в
следующем:
проектируемое
приложение
или
программная
система
представляются в форме вариантов использования, с которыми могут
взаимодействовать внешние сущности или актеры. При этом актером или
действующим лицом называется любой объект, субъект или система,
взаимодействующая с моделируемой системой извне. Это может быть
человек, техническое устройство, программа или любая другая система,
которая служит источником воздействия на моделируемую систему так, как
определит разработчик. Вариант использования служит для описания
действий, которые актер может совершать в системе. При этом ничего не
говорится о том, каким образом будет реализовано взаимодействие актеров с
системой и как будут выполняться сами вариантов использования.
Основной актер системы – пользователь. Он может использовать
следующие функции мобильного приложения:
1) выбрать режим тренировки;
16
2) выбрать режим редактирования уровней. Пользователь может
создать, редактировать или удалить уровень;
3) посмотреть статистику;
4) выйти из игры.
Диаграмма вариантов использования представлена на рисунке 2.2.1.
Рисунок 2.2.1 – Диаграмма вариантов использования
Сплошные линии на диаграмме представляют собой отношения
ассоциации, отражающие возможность использования актером прецедента.
На
диаграмме
тренировку»
и
вариантов
прецедент
использования
«Выбрать
уровень»
прецедент
связаны
«Начать
отношением
включения (include), так как начать тренировку невозможно, пока не выбран
уровень, а отношение включения иллюстрирует, что именно использует
базовый вариант для выполнения операции.
Прецедент «Открыть редактор» и прецеденты «Создать уровень»,
«Редактировать уровень» и «Удалить уровень» связаны отношением
расширения (extend), что показывает, что функциональное поведение
17
расширяемых прецедентов задействуется базовым не всегда, а только при
выполнении дополнительных условий.
Уровень не будет создан, пока не будут выбраны объекты и пока
уровень не будет сохранен, поэтому прецеденты «Выбрать объект» и
«Сохранить уровень» включаются в прецедент «Создать уровень».
Чтобы изменить уровень, необходимо сначала выбрать уровень, а
потом выбрать объект и сохранить уровень. Поэтому соответствующие
прецеденты связаны отношением включения.
Для того, чтобы удалить уровень, сначала надо выбрать уровень,
поэтому
соответствующие
прецеденты
также
связаны
отношением
включения.
2.2 Диаграмма классов
Центральное место в объектно-ориентированном программировании
занимает разработка логической модели системы в виде диаграммы классов.
Диаграмма классов – диаграмма, демонстрирующая классы системы, их
атрибуты, методы и взаимосвязи между ними [4].
Диаграммы классов предлагают ряд преимуществ. Они используются
для:
1) иллюстрации
модели
данных
для
информационных
систем,
независимо от того, насколько они просты или сложны;
2) лучшего понимания общего обзора схем приложения;
3) визуального отображения любых конкретных потребностей системы,
что позволяет распространить эту информацию всем участником проекта;
4) создания подробной диаграммы, в которой выделяют любой
конкретный код, который необходимо запрограммировать и реализовать для
описанной структуры;
5) представления
используемых
в
компонентами [8].
независимых
системе,
которые
от
реализации
затем
описаний
передаются
типов,
между
его
18
Стандартная диаграмма классов состоит из трех разделов.
Верхний раздел: содержит имя класса. Этот раздел всегда требуется,
независимо от того, говорится ли о классификаторе или объекте.
Средний раздел: содержит атрибуты класса. Этот раздел используется,
чтобы описать данные класса. Это необходимо только при описании
конкретного экземпляра класса.
Нижняя часть: включает операции класса (методы). Отображается в
формате списка, каждая операция занимает свою собственную линию.
Методы описывают, как класс взаимодействует с данными.
На рисунке 2.2.1 представлен класс, который описывает текстуру
объектов.
Рисунок 2.2.1 – Класс «Текстура»
Так как текстурой может обладать объект, то добавим класс «Объект»,
который будет связан с классом «Текстура» типом связи композиция.
Каждый объект может состоять из нескольких текстур. В класс «Текстура»
добавим метод «Получить положение текстуры» и в класс «Объект» –
«Получить координаты текстуры» с входным параметром «Номер текстуры».
Связь двух классов представлена на рисунке 2.2.2.
19
Рисунок 2.2.2 – Композиция двух классов
Объекты размещаются в уровне, поэтому добавим класс «Уровень»,
который будет связан с классом «Объект» типом связи агрегация. Каждый
уровень состоит из нескольких объектов. Класс «Уровень» хранит данные об
объектах изменяет и отображает их. Связь двух классов представлена на
рисунке 2.2.3.
20
Рисунок 2.2.3 – Агрегация двух классов
Так как данное приложение предполагает наличие редактора уровней,
то добавим класс «Редактор уровней», который будет связан с классов
«Уровень» типом связи композиция. С помощью редактора уровней
происходит создание уровня, а также изменение или удаление любого из
уровней приложения. Связь двух классов представлена на рисунке 2.2.4.
21
Рисунок 2.2.4 – Композиция двух классов
Класс «Тренировка» связан с классом «Редактор уровней» отношением
зависимости. Зависимость возникает тогда, когда реализация класса одного
объекта зависит от спецификации операций класса другого объекта. Класс
«Тренировка» обращается к полю «Список уровней» класса «Редактор
уровней». Связь двух классов представлена на рисунке 2.2.5.
Рисунок 2.2.5 – Зависимость классов
Диаграмма классов в общем виде представлена на рисунке 2.2.6.
22
Рисунок 2.2.6 – Диаграмма классов
2.3 Диаграмма состояний
Диаграмма состояний демонстрирует все возможные состояния, в
которых может находиться объект, а также процесс смены состояний в
результате внешнего влияния [7].
Диаграмма состояний по сути является графом специального вида,
который представляет некоторый автомат. Каждая диаграмма состояний
обычно начинается с темного круга, который указывает начальное состояние
и
заканчивается
обведенным
кругом,
который
обозначает
конечное
23
состояние. Вершинами графа диаграммы являются состояния и некоторые
другие типы элементов автомата, которые изображаются соответствующими
графическими символами. Дуги графа служат для обозначения переходов из
состояния в состояние. Для понимания семантики конкретной диаграммы
состояний необходимо представлять не только особенности поведения
моделируемой сущности, но и знать общие сведения по теории автоматов.
Однако, диаграммы состояний не обязательно являются лучшим
инструментом
для
сбора
общей
прогрессии
событий.
Скорее,
они
иллюстрируют конкретные виды поведения, в частности, переходы из одного
состояния в другое.
В приложении можно выделить основные состояния:
1) основное меню;
2) меню режима игры;
3) меню режима редактора уровней;
4) запуск уровня;
5) выигрыш;
6) меню «Редактировать уровень»;
7) создание начального положения;
8) создание конечного положения;
9) меню «Удалить уровень» ;
10) удаление уровня.
Построенная диаграмма для этих состояний представлена на рисунке
2.3.1.
Из начального состояния осуществляется переход состояния в
состояние «Основное меню». Далее в зависимости от действия пользователя
может быть осуществлен переход в одно из трех состояний.
Если пользователь нажимает на кнопку «Выбор уровня», то переход
осуществляется в состояние «Меню режима игры», где пользователь
выбирает уровень, который он хочет запустить и перейти в состояние
24
«Запуск уровня» по кнопке «Начать игру». Приложение перейдет в состояние
«Выигрыш», как только координаты совпадут с условием выигрыша.
Если пользователь нажимает на кнопку «Редактор уровней», то
переход осуществляется в состояние «Меню режима редактора уровней», где
также может быть осуществлен переход в одно из трех состояний. Первый
переход – переход в состояние «Создание начального положения» по кнопке
«Создать уровень». Пользователь выбирает объекты и задает их начальные
координаты. Далее переход осуществляется на «Создание конечного
положения» по кнопке «Сохранить». В этом состоянии пользователь задает
координаты объектов для определения выигрыша игрока. По кнопке
«Сохранить» осуществляется сохранение уровня и переход в состояние
«Основное меню». Второй возможный переход – переход в состояние «Меню
«Редактировать уровень» по кнопке «Редактировать уровень». Пользователь
выбирает уровень для изменения и осуществляется переход в состояние
«Создание
начального
положения»
по
кнопке
«Изменить
уровень».
Дальнейшие переходы из этого состояния описаны выше. Третий переход –
переход в состояние «Меню «Удалить уровень» по кнопке «Удалить
уровень». Пользователь выбирает уровень для удаления и по кнопке
«Удалить уровень» осуществляется переход в состояние «Удаление уровня».
Из всех состояний, кроме состояния «Создание конечного
положения» по кнопке «Home» можно вернуться в состояние «Основное
меню».
25
Рисунок 2.3.1 – Диаграмма состояний
26
3 ПРОЕКТИРОВАНИЕ
3.1 Частные алгоритмы
В данном пункте будут представлены некоторые частные алгоритмы
игрового процесса.
Рассмотрим алгоритм создания уровня. Обобщенная схема алгоритма
представлена на рисунке 3.1.1.
Рисунок 3.1.1 – Обобщенная схема алгоритма создания уровня
27
Пользователь выбирает объекты, которые будут задействованы в
создаваемом уровне, и задает им начальные координаты и координаты,
которых нужно достичь, чтобы пройти этот уровень. Блок «Сохранить
начальные положения объектов» и блок «Сохранить уровень» заносят в
память приложения данные об уровне.
Следующий
не
менее
важный
алгоритм
–
алгоритм
режима
тренировки. Обобщенная схема алгоритма представлена на рисунке 3.1.2.
Рисунок 3.1.2 – Обобщенная схема алгоритма режима тренировки
Блок «Расстановка объектов уровня» обращается к памяти приложения,
откуда достает информацию об уровне и воссоздает сцену выбранного
пользователем уровня.
Обобщенный алгоритм редактирования уровня представлен на рисунке
3.1.3.
28
Рисунок 3.1.3 – Обобщенная схема алгоритма редактирования уровня
Рассмотрим блок «Вращение объектов». Чтобы реализовать данный
метод, обратимся к законам физики.
Вращательное движение – это движение твердого тела, имеющего как
минимум две неподвижные точки. Прямая, проходящая через эти точки,
29
называется осью вращения. Положение тела определено, если задан угол
поворота тела φ между плоскостями П0 и П, одна из которых неподвижна, а
другая жестко связана с телом.
Закон вращательного движения твердого тела вокруг неподвижной оси
 = ().
(3.1.1)
Величина , характеризующая быстроту изменения угла поворота φ с
течением времени, называется угловой скоростью.
Числовое значение угловой скорости тела  в данный момент времени
равно первой производной от угла поворота  по времени, то есть
=


.
(3.1.2)
Если угловая скорость тела остается во время движения постоянной, то
вращение тела называется равномерным. Учитывая это, получим формулу
вращательного движения
 = 0 + ,
(3.1.3)
которую необходимо реализовать в разрабатываемом приложении.
В трехмерном пространстве любое аффинное преобразование может
быть представлено в виде суперпозиции растяжений, вращений, переносов и
отражений. Опишем подробно матрицы для преобразования объекта
вращением.
Вращение вокруг оси x:
1
(0
0
0
cos 
sin 
0
−sin  )
cos 
(3.1.4)
cos 
( 0
sin 
0 − sin 
1
0 )
0 cos 
(3.1.5)
cos 
( sin 
0
− sin 
cos 
0
(3.1.6)
Вращение вокруг оси y:
Вращение вокруг оси z:
0
0)
1
30
В
трёхмерном
пространстве
для
описания
поворота
можно
использовать углы Эйлера.
Матрица поворота вектора в декартовой системе координат через углы
Эйлера:
cos  cos 
( sin  cos 
−sin 
cos  sin  sin  − sin  cos 
sin  sin  sin  + cos  cos 
cos  sin 
cos  sin  cos  + sin  sin 
sin  sin  cos  − cos  sin  )
cos  cos 
(3.1.7)
Обобщенная схема алгоритма вращения объекта представлена на
рисунке 3.1.4.
Рисунок 3.1.4 – Обобщенная схема алгоритма вращения объекта, лист 1
31
Рисунок 3.1.4, лист 2
3.2 Пользовательский интерфейс
Карта диалоговых окон представляет дизайн пользовательского
интерфейса на высоком уровне абстракции. На ней показаны элементы
диалоговых окон в системе и ссылки навигации между ними, но не показан
подробный дизайн экрана. Прямоугольником обозначается диалоговое окно.
Стрелки, исходящие из этого прямоугольника на карте диалоговых окон
показывают все возможные навигации – и, следовательно, функциональность
– доступные пользователю в данном контексте. Некоторые переходы
позволяют пользователю откатить операцию.
С
помощью
такой
карты
можно
обнаружить
отсутствующие,
неправильные или ненужные переходы и, следовательно, отсутствующие,
неправильные или ненужные требования [1].
Карта диалоговых окон представлена на рисунке 3.2.1.
32
В разрабатываемом приложении семь диалоговых окон. Рассмотрим
некоторые из них.
Из диалогового окна «Меню» пользователю доступны действия:
1) выбрать режим тренировки;
2) выбрать режим редактирования;
3) просмотреть статистику;
4) выйти из приложения.
Диалоговое окно «Меню редактора уровней» позволяет совершить
такие действия:
1) выбрать создание уровня;
2) выбрать изменение уровня;
3) выбрать удаление уровня;
4) вернуться в меню.
По мере перемещения по карте диалоговых окон можно увидеть полное
взаимодействие пользователя с системой.
На рисунках 3.2.2 – 3.2.5 представлен более детальный дизайн
пользовательского интерфейса, в котором отображены элементы интерфейса
(меню, кнопки, значки, списки и т. п.), представленные пользователю на
дисплее [5].
33
Рисунок 3.2.1 – Карта диалоговых окон
Рисунок 3.2.2 – Прототип интерфейса режима тренировки
34
Рисунок 3.2.3 – Прототип интерфейса режима создания и редактирования
уровня
Рисунок 3.2.4 – Прототип интерфейса окон для работы с уровнем
35
Рисунок 3.2.5 – Прототип интерфейса окна статистики
36
4 РЕАЛИЗАЦИЯ
4.1 Обзор программных средств разработки
В настоящее время на рынке есть множество платформ для разработки
игр. Каждая из них обладает своими особенностями. Для игры необходимо
найти платформу, которая будет удовлетворять следующим требованиям:
1) возможность разработки для мобильных устройств;
2) возможность разработки 3D игр;
3) удобство использования;
4) наличие качественной документации;
5) свободно распространяемый.
UNREAL ENGINE 4 – написанный на языке C++, игровой движок
позволяет создавать игры для большинства операционных систем и
платформ: Microsoft Windows, Linux, Mac OS и Mac OS X; консолей Xbox,
PlayStation, Wii и т.д. , а также на различных портативных устройствах,
например, устройствах Apple управляемых системой iOS, Android и прочих.
Одним
из
интересных
свойств
данного
инструмента
является
его
универсальность. Удивительно, но с помощью него можно написать
практически любую игру различного жанра и направления. В рамках
игрового движка можно выделить ключевые классы и объекты:
– actor – родительский класс, содержащий все объекты, которые имеют
отношение к игровому процессу и имеют пространственные координаты.
– pawn (пешка) – модель игрока и его противников, управляемый
искусственным интеллектом.
– world – сама окружающая игровая среда.
Torque – кросс-платформенный инструмент для разработки двумерных
и трехмерных приложений и игр, работающий под операционными
системами Windows, OS X, Linux. Способен осуществлять проекты для
множества основных платформ: PC, Mac, Xbox 360, Wii, iPhone, Android, а
также для WEB. Имеются очень удобные утилиты и модули: Terrain Editor,
37
River & Road Editors, Particle Editor, Material Editor, Shape Editor, Decal Editor,
GUI Editor и ещё несколько других, которые предназначаются для создания и
редактирования всех аспектов игры. Звуковая подсистема поддерживает
DirectSound и OpenAL.
Unity – кросс-платформенный инструмент для разработки двумерных и
трехмерных приложений и игр, работающий под операционными системами
Windows и OS X. Позволяет разрабатывать под все самые известные
платформы, такие как: PC, Linux, Mac, IOS, Android, Xbox One, PS4 и т.д.
Unity имеет очень простой интерфейс, который разбит на несколько окон:
Hierarchy, где находятся названия всех объектов на сцене, которые можно
группировать; Scene, где можно рассмотреть игровое поле под нужным
ракурсом; Inspector, в котором находятся все свойства выделенного объекта и
его компоненты; Project, где находятся все материалы проекта; Toolbar, где
находится меню с инструментами. Проект в Unity делится на сцены –
отдельные файлы, содержащие свой набор объектов, скриптов и настроек.
Основным объектом игровой логики является игровой объект – сущность,
которая включает в себя компоненты. При работе с Unity можно
импортировать любые пакеты в проект. Пакет – это файл .unitypackage,
который содержит предварительно упакованные ресурсы (модели, код,
сцены, плагины и т.д.). Эти ресурсы можно повторно использовать и
распространять.
Также существует магазин Asset Store, в котором собраны бесплатные
и коммерческие ассеты, созданные как Unity Technologies, так и другими
пользователями. Ассеты доступны через встроенный в Unity простой
интерфейс, через которой можно скачивать и импортировать в проект
необходимые ресурсы. Все, что загружается с Asset Store поступает в виде
файла с расширением .unitypackage и локально кэшируется в системе.
Достоинства:
1) удобство использования и простота освоения;
2) качественная документация;
38
3) большое сообщество разработчиков использующих Unity;
4) возможность настроить и доработать среду разработки под нужный
проект;
5) интегрированные сервисы монетизации и аналитики;
6) кросс-платформенность.
Недостатки:
1) необходимо глубокое знание одного из используемых языков
программирования;
2) обновления могут испортить уже рабочий код;
3) условно-бесплатный.
По итогу обзора, для разработки игрового приложения, была выбрана
платформа Unity. Так как она обладает наибольшим числом достоинств, а
также имелся опыт работы с ней.
4.2 Реализация компонентов программы
Класс «Объект», описанный в диаграмме классов, реализован с
помощью стандартного класса GameObject – это базовый класс для всех
объектов в сцене Unity. Компоненты (Components) определяют поведение
объектов в игре. Они – функциональная часть каждого игрового объекта
(GameObject). Существуют компоненты для функциональности камеры и
звука, коллайдеры и твердые тела, сторонние пользовательские компоненты
и другие.
В Unity невозможно создать GameObject без компонента Transform.
Компонент Transform – один из самых важных компонентов, так как все
свойства GameObject’а связанные с трансформациями используют этот
компонент. Он определяет положение, вращение и масштаб GameObject’а в
окне Scene.
Для реализации приложения использовался метод класса GameObject
FindGameObjectsWithTag (строковый тег). Этот метод возвращает список
39
активных объектов класса GameObject, которые были помечены тегом,
переданным в качестве параметра в метод.
Также был использован метод Length. Этот метод подсчитывает
количество элементов в массиве объектов с типом GameObject.
Следующий метод класса GameObject – SetActive(bool value). Делает
объект активным или не активным.
Теперь объект obj будет уничтожен или если время будет указано через
несколько секунд. Если obj является Компонентом, он удалит компонент из
GameObject и уничтожит его. Если obj является GameObject, он уничтожит
GameObject, все его компоненты и все. Фактическое уничтожение объекта
всегда задерживается до текущего обновления, но всегда будет выполняться
перед рендерингом.
Еще один метод – GameObject.transform.rotation – текущий угол
поворота объекта, основанный на кватернионах. Возвращает объект типа
Quaternion.
Кватернионы представляет собой удобное математическое обозначение
положения и вращения объектов в пространстве. По сравнению с углами
Эйлера, кватернионы позволяют проще комбинировать вращения, а также
избежать проблемы, связанной с невозможностью поворота вокруг оси,
независимо от совершённого вращения по другим осям. Еще одно
преимущество кватернионов – расчеты суммарных поворотов. Для того,
чтобы посчитать сложный поворот достаточно просто перемножить
кватернионы. Причем порядок перемножения имеет значение. Эта операция
быстрее чем перемножение матриц поворотов. Кватернионы нашли своё
применение
в
компьютерной
графике,
робототехнике,
навигации,
молекулярной динамике.
Метод Quaternion (x, y, z, w) класса Quaternion создает новый
кватернион с заданными компонентами x, y, z, w.
Метод
Instantiate
выбранного объекта.
(Object
original)
класса
Object
создает
клон
40
Метод Destroy(Object obj) удаляет игровой объект, компонент или
ассет. Если obj будет экземпляром класса Component, то метод Destroy
удалит компонент из GameObject и уничтожит его. Если obj – экземпляр
класса GameObject, то метод Destroy удалит этот экзмепляр со всеми его
компонентами.
Структура Vector3 класса UnityEngine представляет трехмерные
векторы и точки. Эта структура используется во всем Unity для передачи 3Dпозиций и направлений. Она также содержит функции для выполнения
общих векторных операций. Другие классы также могут использоваться для
управления векторами и точками.
Все уровни сохраняются и загружаются с помощью класса PlayerPrefs,
который способен сохранить переменные строкового и числового типа
(string, int, float).
В зависимости от выбранного уровня осуществляется
обращение к памяти через класс PlayerPrefs [10].
Для реализации приложения используются следующие методы класса
PlayerPrefs, описанные ниже.
Методы для загрузки данных в кэш приложения:
 SetString;
 SetInt;
 SetFloat.
Методы для считывания данных из памяти:
Чтобы указать переменную сохранения и загрузки в PlayerPrefs, надо
писать:
 GetString;
 GetInt;
 GetFloat.
Чтобы удалить запись из памяти, используется метод DeleteKey(ключ).
Чтобы очистить все данные используется метод DeleteAll().
41
Для реализации вращения был использован метод джойстика GetAxis,
который возвращает направление поворота объекта по горизонтальной и
вертикально осям. Также использовался стандартный метод Time.deltaTime,
определяющий время, которое потребовалось для прохождения последнего
кадра, чтобы плавно вращать объект. Компонент джойстик и скрипты,
связанные с ним, были импортированы в проект с помощью стандартного
модуля Unity.
Метод выпадающего списка AddOptions (List<OptionData> options), где
options
–
список OptionData
для добавления,
добавляет данные
в
выпадающий список, основанный на списке строк.
Класс OptionData – это класс для хранения текста и / или изображения
одной опции (option) в раскрывающемся списке [6].
Код готового приложения представлен в приложении А.
4.3 Реализация приложения
Пользовательский интерфейс реализован с помощью системы Unity UI,
которая позволяет создавать и настраивать пользовательские интерфейсы
прямо в редакторе. Все объекты UI являются игровыми объектами, но
располагаются они в плоскости прямоугольника камеры. Основным
объектом является Canvas, который отвечает за рендеринг всех объектов
пользовательского интерфейса, остальные объекты являются дочерними по
отношению к нему. Объекты пользовательского интерфейса включают в себя
компоненту
RectTransform,
которая
отвечает
за
положение
и
масштабирование объекта в прямоугольной плоскости камеры.
Основные виды объектов, которые были использованы в реализации
пользовательского интерфейса:
1) UI.Button
–
стандартная
кнопка,
при
нажатии
на
которую
выполняются заданные события;
2) UI.Image используется для отображения спрайтов в системе Unity
UI;
42
3) UI.Text используется для отображения текста и настройки шрифта в
системе Unity UI;
4) UI.Dropdown используется для выбора вариантов из выпадающего
списка. Он представляет собой графический элемент управления, который
позволяет пользователю выбирать одно значение из списка. Когда
раскрывающийся список неактивен, он отображает одно значение. При
активации он отображает весь список значений, из которых пользователь
может выбрать один. Когда пользователь выбирает новое значение, элемент
управления
возвращается
к
его
неактивному состоянию,
отображая
выбранное значение.
5) UI.Scrollbar
–
полоса
прокрутки
представляет
собой
метод
взаимодействия или виджет, в котором непрерывный текст, изображения или
любой другой контент можно прокручивать в заданном направлении (вверх,
вниз, влево или вправо) на экране устройства.
6) UI.InputField – поле ввода – это способ редактирования текста
текстового элемента. Как и другие элементы управления взаимодействием,
он не является видимым элементом пользовательского интерфейса сам по
себе и должен быть объединен с одним или несколькими визуальными
элементами пользовательского интерфейса, чтобы быть видимым. Свойство
Text самого элемента Text будет меняться по мере того, как пользователь
вводит его, и значение может быть извлечено из скрипта после
редактирования [9].
На рисунках 3.2.1-3.2.8 приведены некоторые экранные формы
приложения.
43
Рисунок 3.2.1 – Стартовое окно приложения
На рисунке 3.2.1 представлено стартовое окно приложения. Из этого
окна пользователь может перейти к выбору уровня для тренировки (нажатие
кнопки «Выбор уровня»), войти в режим создания, изменения и удаления
уровней (нажатие кнопки «Редактировать уровень»), выйти из приложения
(нажатие кнопки «Выход»).
Также в правом верхнем углу экрана расположена кнопка для
просмотра статистики.
На рисунке 3.2.2 представлено окно для выбора уровня в режиме
тренировки. Уровень для тренировки выбирается из выпадающего списка,
расположенного
вверху
экрана.
После
того,
как
уровень
выбран,
пользователь может перейти в режим тренировки (нажатие кнопки «Начать
тренировку»).
Кроме того, в левом нижнем углу экрана расположена кнопка возврата
в главное меню приложения.
44
Рисунок 3.2.2 – Выбор уровня в режиме тренировки
Рисунок 3.2.3 – Режим тренировки
45
На рисунке 3.2.3 представлен режим тренировки. В правом нижнем
углу экрана расположен джойстик для вращения объектов данного уровня. В
левом нижнем углу размещена кнопка, нажатие на которую приводит к смене
объекта управления. В левом верхнем углу экрана расположена кнопка
возврата в главное меню приложения.
Рисунок 3.2.4 – Окно выигрыша
На рисунке 3.2.4 представлено окно выигрыша. Пользователь может
закрыть это окно нажатием по экрану.
На рисунке 3.2.5 представлено меню редактора уровня. Из этого окна
пользователь может перейти к созданию уровня (нажатие кнопки «Создать
уровень»), редактировать уровень (нажатие кнопки «Изменить уровень»),
удалить уровень (нажатие кнопки «Удалить уровень»).
В левом верхнем углу экрана расположена кнопка возврата в главное
меню приложения.
46
Рисунок 3.2.5 – Меню редактора уровней
Рисунок 3.2.6 – Выбор уровня для изменения
На
рисунке
3.2.6
представлено
окно
выбора
уровня
для
редактирования. Уровень для редактирования выбирается из выпадающего
47
списка, расположенного вверху экрана. После того, как уровень выбран,
пользователь может перейти в режим редактирования (нажатие кнопки
«Изменить уровень»).
Кроме того, в левом нижнем углу экрана расположена кнопка возврата
в главное меню приложения.
Рисунок 3.2.7 – Режим создания/редактирования уровня
На рисунке 3.2.7 представлен режим создания или редактирования
уровня. В правом нижнем углу экрана расположен джойстик для вращения
объектов данного уровня. В левом нижнем углу размещена кнопка, нажатие
на которую приводит к смене объекта управления. В левом верхнем углу
экрана расположена кнопка возврата в главное меню приложения. Под
кнопкой возврата в меню расположена кнопка сохранения уровня. В правом
верхнем углу располагается панель для ввода рекомендованного времени
прохождения уровня. В центре экрана расположен выпадающий список, из
которого можно выбрать новый объект для уровня или заменить
существующий.
48
Рисунок 3.2.8 – Выбор уровня для удаления
Рисунок 3.2.9 – Статистика
49
На рисунке 3.2.8 представлено окно выбора уровня для удаления.
Уровень для удаления выбирается из выпадающего списка, расположенного
вверху экрана. После того, как уровень выбран, пользователь может удалить
его (нажатие кнопки «Удалить уровень»).
Кроме того, в левом нижнем углу экрана расположена кнопка возврата
в главное меню приложения.
На рисунке 3.2.9 представлено окно статистики. В центре экрана
расположена таблица такой с информацией по каждому уровню, как номер
уровня, время прохождения и рекомендуемое время прохождения.
Кроме того, в левом нижнем углу экрана расположена кнопка возврата
в главное меню приложения.
50
ЗАКЛЮЧЕНИЕ
В результате работы было составлено описание предметной области,
проведен анализ программ-аналогов, на основе чего были сформулированы
требования
к
создаваемой
системе.
Изучены
и
выбраны
наиболее
подходящие средства реализации. Кроме того, была спроектирована и
реализована обучающая программа на тему «Развитие пространственного
мышления с помощью теневых проекций».
Таким образом, все поставленные задачи работы можно считать
решенными, а цель – достигнутой.
51
СПИСОК ЛИТЕРАТУРЫ
1)
Вигерс, К. Разработка требований к программному обеспечению /
К. Вигерс, Д. Битти. – СПб.: БХВ-Петербург, 2014. – 736 с.
2)
Каплунович, И. Я. Показатели развития пространственного
мышления школьников / И. Я. Каплунович // Вопросы психологии. – 1981.
—
№5 , с. 151-157
3)
Каплунович, И. Я. Развитие структуры пространственного
мышления / И. Я. Каплунович // Вопросы психологии. – 1986.
—
№2 , с. 56-
66
4)
Леоненков, А. В. Самоучитель UML 2 / А. В. Леоненков. – СПб.:
БХВ-Петербург, 2007. – 576 с.
5)
Мандел,
Т.
Разработка
пользовательского
интерфейса:
практическое пособие / Т. Мандел. – М.: ДМК Пресс, 2008. – 412 с.
6)
Попов, Д. И. Программирование на языке высокого уровня Си-
Шарп / Д. И. Попов, Д. Г. Демидов. – М.: Изд-во МГУП, 2009. – 280 с.
7)
Рамбо, Д. UML 2.0. Объектно-ориентированное моделирование и
разработка / Д. Рамбо, М. Блаха. – СПб.: Питер, 2007. – 544 с.
8)
Фаулер, М. UML Основы / М. Фаулер. – СПб: Символ-Плюс,
2005. – 184 с.
9)
Хокинг, Д. Unity в действии. Мультиплатформенная разработка
на C# / Д. Хокинг. – СПб: Питер, 2016. – 336 с.
10)
Шилдт, Г. С# 4.0: полное руководство / Г. Шилдт. – М.: Вильямс,
2011. – 1056 с.
52
ПРИЛОЖЕНИЕ А
(обязательное)
ЛИСТИНГ ПРОГРАММЫ
public class Shadow : MonoBehaviour {
public GameObject obj1, obj2, obj3, obj4, obj5, obj6;
GameObject gameOb1, gameOb2;
string str,s;
GameObject func(int i)
{
GameObject gOb
switch (i)
{
case 0:
gOb = obj1;
break;
case 1:
gOb = obj2;
break;
case 2:
gOb = obj3;
break;
case 3:
gOb = obj4;
break;
case 4:
gOb = obj5;
53
break;
case 5:
gOb = obj6;
break;
}
return gOb;
}
private void Start()
{
switch (PlayerPrefs.GetInt("Level"))
{
case 1:
Instantiate(obj1, new Vector3(2.6f, 0.2f, 3.4f),
new Quaternion(obj1.transform.rotation.x, obj1.transform.rotation.y,
obj1.transform.rotation.z, 0));
Instantiate(obj2, new Vector3(2.6f, 1.7f, 3.4f),
new Quaternion(obj2.transform.rotation.x, obj2.transform.rotation.y,
obj2.transform.rotation.z, 0));
break;
case 2:
Instantiate(obj3, new Vector3(2.6f, 0.2f, 3.4f),
new Quaternion(obj3.transform.rotation.x, obj3.transform.rotation.y,
obj3.transform.rotation.z, 0));
Instantiate(obj4, new Vector3(2.6f, 1.7f, 3.4f),
new Quaternion(obj4.transform.rotation.x, obj4.transform.rotation.y,
obj4.transform.rotation.z, 0));
break;
case 3:
Instantiate(obj5, new Vector3(2.6f, 0.2f, 3.4f),
54
new Quaternion(obj5.transform.rotation.x, obj5.transform.rotation.y,
obj5.transform.rotation.z, 0));
Instantiate(obj6, new Vector3(2.6f, 1.7f, 3.4f),
new Quaternion(obj6.transform.rotation.x, obj6.transform.rotation.y,
obj6.transform.rotation.z, 0));
break;
default:
s = PlayerPrefs.GetInt("CountLevel").ToString();
int f = PlayerPrefs.GetInt("Level") - 3;
str = f.ToString();
gameOb1 = func(PlayerPrefs.GetInt("Type1" + str));
gameOb2 = func(PlayerPrefs.GetInt("Type2" + str));
float x1, y1, z1, w1, x2, y2, z2, w2;
x1 = PlayerPrefs.GetFloat("X1" + str);
y1 = PlayerPrefs.GetFloat("Y1" + str);
z1 = PlayerPrefs.GetFloat("Z1" + str);
w1 = PlayerPrefs.GetFloat("W1" + str);
x2 = PlayerPrefs.GetFloat("X2" + str);
y2 = PlayerPrefs.GetFloat("Y2" + str);
z2 = PlayerPrefs.GetFloat("Z2" + str);
w2 = PlayerPrefs.GetFloat("W2" + str);
Instantiate(gameOb1, new Vector3(2.6f, 0.2f, 3.4f),
new Quaternion(x1, y1, z1, w1));
Instantiate(gameOb2, new Vector3(2.6f, 1.7f, 3.4f),
new Quaternion(x2, y2, z2, w2));
break;
}
}
}
public class Save : MonoBehaviour {
55
public GameObject home,drop;
private static int stage = 1;
int i;
void OnMouseDown()
{
if (stage == 1)
{
if (Redactor.num == 1)
{
i = PlayerPrefs.GetInt("CountLevel") + 1;
}
else
{
i = PlayerPrefs.GetInt("Level");
}
PlayerPrefs.SetInt("Type1" + i.ToString(), Redactor.v1);
PlayerPrefs.SetInt("Type2" + i.ToString(), Redactor.v2);
PlayerPrefs.SetFloat("X1" + i.ToString(),
Redactor.gameOb1.transform.rotation.x);
PlayerPrefs.SetFloat("Y1" + i.ToString(),
Redactor.gameOb1.transform.rotation.y);
PlayerPrefs.SetFloat("Z1" + i.ToString(),
Redactor.gameOb1.transform.rotation.z);
PlayerPrefs.SetFloat("W1" + i.ToString(),
Redactor.gameOb1.transform.rotation.w);
PlayerPrefs.SetFloat("X2" + i.ToString(),
Redactor.gameOb2.transform.rotation.x);
56
PlayerPrefs.SetFloat("Y2" + i.ToString(),
Redactor.gameOb2.transform.rotation.y);
PlayerPrefs.SetFloat("Z2" + i.ToString(),
Redactor.gameOb2.transform.rotation.z);
PlayerPrefs.SetFloat("W2" + i.ToString(),
Redactor.gameOb2.transform.rotation.w);
home.SetActive(false);
drop.SetActive(false);
stage++;
}
else
{
PlayerPrefs.SetFloat("X1k" + i.ToString(),
Redactor.gameOb1.transform.rotation.eulerAngles.x);
PlayerPrefs.SetFloat("Y1k" + i.ToString(),
Redactor.gameOb1.transform.rotation.eulerAngles.y);
PlayerPrefs.SetFloat("Z1k" + i.ToString(),
Redactor.gameOb1.transform.rotation.eulerAngles.z);
PlayerPrefs.SetFloat("W1k" + i.ToString(),
Redactor.gameOb1.transform.rotation.w);
PlayerPrefs.SetFloat("X2k" + i.ToString(),
Redactor.gameOb2.transform.rotation.eulerAngles.x);
PlayerPrefs.SetFloat("Y2k" + i.ToString(),
Redactor.gameOb2.transform.rotation.eulerAngles.y);
PlayerPrefs.SetFloat("Z2k" + i.ToString(),
Redactor.gameOb2.transform.rotation.eulerAngles.z);
PlayerPrefs.SetFloat("W2k" + i.ToString(),
Redactor.gameOb2.transform.rotation.w);
if (Redactor.num == 1)
{
57
PlayerPrefs.SetInt("CountLevel", i);
}
home.SetActive(true);
drop.SetActive(true);
stage = 1;
Redactor.num = 0;
SceneManager.LoadScene("Menu");
}
}
}
public class Redactor : MonoBehaviour {
public static int num = 0;
public Dropdown drop;
public GameObject obj1, obj2, obj3, obj4, obj5, obj6, reload, joyst, save;
static public int count = 0, v1, v2=1000;
static public GameObject gameOb1, gameOb2;
static public float a1, b1, c1, a2, b2, c2;
GameObject func(int i)
{
GameObject gOb = obj1;
switch (i)
{
case 0:
gOb = obj1;
break;
case 1:
gOb = obj2;
break;
58
case 2:
gOb = obj3;
break;
case 3:
gOb = obj4;
break;
case 4:
gOb = obj5;
break;
case 5:
gOb = obj6;
break;
}
return gOb;
}
private void Start()
{
if (num == 1)
{
gameOb1 = Instantiate(obj1, new Vector3(2.6f, 0.2f, 3.4f),
new Quaternion(obj1.transform.rotation.x, obj1.transform.rotation.y,
obj1.transform.rotation.z, 0));
a1 = gameOb1.transform.rotation.eulerAngles.x;
b1 = gameOb1.transform.rotation.eulerAngles.y;
c1 = gameOb1.transform.rotation.eulerAngles.z;
count = 1;
v1 = 0;
}
else
59
{
string s = PlayerPrefs.GetInt("CountLevel").ToString();
int f = PlayerPrefs.GetInt("Level");
string str = f.ToString();
v1 = PlayerPrefs.GetInt("Type1" + str);
v2 = PlayerPrefs.GetInt("Type2" + str);
float w1, w2;
a1 = PlayerPrefs.GetFloat("X1" + str);
b1 = PlayerPrefs.GetFloat("Y1" + str);
c1 = PlayerPrefs.GetFloat("Z1" + str);
w1 = PlayerPrefs.GetFloat("W1" + str);
a2 = PlayerPrefs.GetFloat("X2" + str);
b2 = PlayerPrefs.GetFloat("Y2" + str);
c2 = PlayerPrefs.GetFloat("Z2" + str);
w2 = PlayerPrefs.GetFloat("W2" + str);
gameOb1 = Instantiate(func(v1), new Vector3(2.6f, 0.2f, 3.4f),
new Quaternion(a1, b1, c1, w1));
gameOb2 = Instantiate(func(v2), new Vector3(2.6f, 1.7f, 3.4f),
new Quaternion(a2, b2, c2, w2));
count = 2;
MoveRedact.object1 = gameOb1;
MoveRedact.object2 = gameOb2;
}
}
}
public class MoveRedact : MonoBehaviour {
public static GameObject object1;
public static GameObject object2;
private GameObject[] objects;
60
public float speed = 25f;
void Update()
{
objects = GameObject.FindGameObjectsWithTag("Player");
if (objects.Length == 1)
{
if (object1 == objects[0])
{
object1 = objects[0];
}
else if (object2 == objects[0])
{
object2 = objects[0];
}
else
{
object1 = objects[0];
}
}
else
{
if (object1 == objects[0])
{
object1 = objects[0];
object2 = objects[1];
}
else if (object1 == objects[1])
{
object1 = objects[1];
object2 = objects[0];
61
}
else if (object2 == objects[0])
{
object2 = objects[0];
object1 = objects[1];
}
else if (object2 == objects[1])
{
object2 = objects[1];
object1 = objects[0];
}
}
float x = CrossPlatformInputManager.GetAxis("Horizontal");
float y = CrossPlatformInputManager.GetAxis("Vertical");
if (Button.check == true)
{
if (x != 0 || y != 0)
{
Redactor.a1 += y * speed * Time.deltaTime;
Redactor.b1 -= x * speed * Time.deltaTime;
object1.transform.rotation = Quaternion.Euler(Redactor.a1, Redactor.b1,
Redactor.c1);
}
}
else
{
if (x != 0 || y != 0)
{
Redactor.a2 += y * speed * Time.deltaTime;
Redactor.b2 -= x * speed * Time.deltaTime;
62
object2.transform.rotation = Quaternion.Euler(Redactor.a2, Redactor.b2,
Redactor.c2);
}
}
}
}
public class Move : MonoBehaviour {
private GameObject object1;
private GameObject object2;
private GameObject[] objects;
public float speed = 1f;
private Vector3 pos,pos1;
private float x1, y1, z1, w1, x2, y2, z2, w2, eps;
private string str;
float a1, b1, c1, a2, b2, c2;
void Start()
{
objects = GameObject.FindGameObjectsWithTag("Player");
object1 = objects[0];
object2 = objects[1];
str = PlayerPrefs.GetInt("CountLevel").ToString();
x1 = PlayerPrefs.GetFloat("X1k" + str);
y1 = PlayerPrefs.GetFloat("Y1k" + str);
z1 = PlayerPrefs.GetFloat("Z1k" + str);
w1 = PlayerPrefs.GetFloat("W1k" + str);
x2 = PlayerPrefs.GetFloat("X2k" + str);
63
y2 = PlayerPrefs.GetFloat("Y2k" + str);
z2 = PlayerPrefs.GetFloat("Z2k" + str);
w2 = PlayerPrefs.GetFloat("W2k" + str);
a1 = object1.transform.rotation.eulerAngles.x;
b1 = object1.transform.rotation.eulerAngles.y;
c1 = object1.transform.rotation.eulerAngles.z;
a2 = object2.transform.rotation.eulerAngles.x;
b2 = object2.transform.rotation.eulerAngles.y;
c2 = object2.transform.rotation.eulerAngles.z;
eps = 5.5f;
}
void Update()
{
float x = CrossPlatformInputManager.GetAxis("Horizontal");
float y = CrossPlatformInputManager.GetAxis("Vertical");
if (Button.check == true)
{
if (x != 0 || y != 0)
{
a1 += y * speed * Time.deltaTime * 25;
b1 -= x * speed * Time.deltaTime * 25;
object1.transform.rotation = Quaternion.Euler(a1, b1, c1);
}
}
else
{
if (x != 0 || y != 0)
{
64
a2 += y * speed * Time.deltaTime * 25;
b2 -= x * speed * Time.deltaTime * 25;
object2.transform.rotation = Quaternion.Euler(a2, b2, c2);
}
}
if ((Math.Abs(object1.transform.rotation.eulerAngles.x - x1) < eps) &&
(Math.Abs(object1.transform.rotation.eulerAngles.y - y1) < eps)
&& (Math.Abs(object1.transform.rotation.eulerAngles.z - z1) < eps) &&
(Math.Abs(object2.transform.rotation.eulerAngles.x - x2) < eps)
&& (Math.Abs(object2.transform.rotation.eulerAngles.y - y2) < eps) &&
(Math.Abs(object2.transform.rotation.eulerAngles.z - z2) < eps))
{
SceneManager.LoadScene("Win");
}
}
}
public class Delete : MonoBehaviour {
public Dropdown drop;
int i,n;
void OnMouseDown()
{
n = drop.value + 1;
i = PlayerPrefs.GetInt("CountLevel") - 1;
PlayerPrefs.DeleteKey("Type1" + n.ToString());
PlayerPrefs.DeleteKey("Type2" + n.ToString());
PlayerPrefs.DeleteKey("X1" + n.ToString());
PlayerPrefs.DeleteKey("Y1" + n.ToString());
65
PlayerPrefs.DeleteKey("Z1" + n.ToString());
PlayerPrefs.DeleteKey("W1" + n.ToString());
PlayerPrefs.DeleteKey("X2" + n.ToString());
PlayerPrefs.DeleteKey("Y2" + n.ToString());
PlayerPrefs.DeleteKey("Z2" + n.ToString());
PlayerPrefs.DeleteKey("W2" + n.ToString());
PlayerPrefs.DeleteKey("X1k" + n.ToString());
PlayerPrefs.DeleteKey("Y1k" + n.ToString());
PlayerPrefs.DeleteKey("Z1k" + n.ToString());
PlayerPrefs.DeleteKey("W1k" + n.ToString());
PlayerPrefs.DeleteKey("X2k" + n.ToString());
PlayerPrefs.DeleteKey("Y2k" + n.ToString());
PlayerPrefs.DeleteKey("Z2k" + n.ToString());
PlayerPrefs.DeleteKey("W2k" + n.ToString());
if (n != i + 1)
{
for (int j = n; j <= i; j++)
{
PlayerPrefs.SetInt("Type1" + j.ToString(), PlayerPrefs.GetInt("Type1" +
(j + 1).ToString()));
PlayerPrefs.SetInt("Type2" + j.ToString(), PlayerPrefs.GetInt("Type2" +
(j + 1).ToString()));
PlayerPrefs.SetFloat("X1" + j.ToString(), PlayerPrefs.GetFloat("X1" + (j
+ 1).ToString()));
PlayerPrefs.SetFloat("Y1" + j.ToString(), PlayerPrefs.GetFloat("Y1" + (j
+ 1).ToString()));
PlayerPrefs.SetFloat("Z1" + j.ToString(), PlayerPrefs.GetFloat("Z1" + (j
+ 1).ToString()));
PlayerPrefs.SetFloat("W1" + j.ToString(), PlayerPrefs.GetFloat("W1" +
(j + 1).ToString()));
66
PlayerPrefs.SetFloat("X2" + j.ToString(), PlayerPrefs.GetFloat("X2" + (j
+ 1).ToString()));
PlayerPrefs.SetFloat("Y2" + j.ToString(), PlayerPrefs.GetFloat("Y2" + (j
+ 1).ToString()));
PlayerPrefs.SetFloat("Z2" + j.ToString(), PlayerPrefs.GetFloat("Z2" + (j
+ 1).ToString()));
PlayerPrefs.SetFloat("W2" + j.ToString(), PlayerPrefs.GetFloat("W2" +
(j + 1).ToString()));
PlayerPrefs.SetFloat("X1k" + j.ToString(), PlayerPrefs.GetFloat("X1k"
+ (j + 1).ToString()));
PlayerPrefs.SetFloat("Y1k" + j.ToString(), PlayerPrefs.GetFloat("Y1k"
+ (j + 1).ToString()));
PlayerPrefs.SetFloat("Z1k" + j.ToString(), PlayerPrefs.GetFloat("Z1k" +
(j + 1).ToString()));
PlayerPrefs.SetFloat("W1k" + j.ToString(), PlayerPrefs.GetFloat("W1k"
+ (j + 1).ToString()));
PlayerPrefs.SetFloat("X2k" + j.ToString(), PlayerPrefs.GetFloat("X2k"
+ (j + 1).ToString()));
PlayerPrefs.SetFloat("Y2k" + j.ToString(), PlayerPrefs.GetFloat("Y2k"
+ (j + 1).ToString()));
PlayerPrefs.SetFloat("Z2k" + j.ToString(), PlayerPrefs.GetFloat("Z2k" +
(j + 1).ToString()));
PlayerPrefs.SetFloat("W2k" + j.ToString(), PlayerPrefs.GetFloat("W2k"
+ (j + 1).ToString()));
}
}
PlayerPrefs.SetInt("CountLevel", i);
SceneManager.LoadScene("Menu");
}
}
Powered by TCPDF (www.tcpdf.org)
68
ИНФОРМАЦИОННО-ПОИСКОВАЯ ХАРАКТЕРИСТИКА
ДОКУМЕНТА НА ЭЛЕКТРОННОМ НОСИТЕЛЕ
Наименование
группы атрибутов
атрибута
1. Описание
Обозначение документа
документа
(идентификатор(ы)
файла(ов))
Наименование документа
2. Даты и время
3. Создатели
4. Внешние
ссылки
5. Защита
6. Характеристики
содержания
Характеристики документа
на электронном носителе
Презентация.pptx
Демонстрационные плакаты
к выпускной
квалификационной работе
Класс документа
ЕСКД
Вид документа
Оригинал документа на
электронном носителе
Аннотация
Демонстрационный
материал, отображающий
основные этапы выполнения
выпускной
квалификационной работы
Использование документа Операционная система
Windows 7, Microsoft
PowerPoint 2013
Дата и время
13.06.2017
копирования документа
Дата создания документа 29.05.2018
Дата утверждения
18.06.2018
документа
Автор
Видулина Т.А.
Изготовитель
Видулина Т.А.
Ссылки на другие
Удостоверяющий лист
документы
№ 140208
Санкционирование
ОГУ имени И.С. Тургенева
Классификация защиты
По законодательству РФ
Объем информации
1 639 753 Б
документа
69
7. Структура
документа(ов)
Наименование плаката
(слайда) №1
Наименование плаката
(слайда) №2
Наименование плаката
(слайда) №3
Наименование плаката
(слайда) №4
Наименование плаката
(слайда) №5
Наименование плаката
(слайда) №6
Наименование плаката
(слайда) №7
Наименование плаката
(слайда) №8
Наименование плаката
(слайда) №9
Наименование плаката
(слайда) №10
Наименование плаката
(слайда) №11
Наименование плаката
(слайда) №12
Титульный лист
Цель и задачи
Теневые проекции
Сравнение с аналогами
Требования к
разрабатываемому
приложению
Диаграмма вариантов
использования
Диаграмма классов
Диаграмма состояний
Алгоритм вращения
Карта диалоговых окон
Выбор платформы
Пример работы приложения
Powered by TCPDF (www.tcpdf.org)
1/--страниц
Пожаловаться на содержимое документа