Создание видеоигры на основе настольной игры Memory. Часть 03: заготовки экранов
Здравствуйте.
Продолжаю рассказывать вам, как создать простую кросс-платформенную видеоигру на основе настольной игры Memory.
Напоминаю, что мои публикации преследуют следующие цели:
1. обучение вас созданию игр;
2. получение обратной связи по обучению.
ЧАСТЬ 3. ЗАГОТОВКИ ЭКРАНОВ
В этой части я покажу, как создать три экрана и как переключаться между ними по щелчку мыши.
СОЗДАНИЕ НОВОГО ПРОЕКТА (memory-colors-guide)
1. Делаем копию (fork) проекта mjin-application-sample
Проект mjin-application-sample мы разбирали в предыдущей части.
Я назову копию memory-colors-guide.
2. Обновляем название проекта в исходных файлах
Необходимо обновить следующие файлы:
* CMakeLists.txt
** Название проекта
** Название библиотеки
* main.cpp
** Заменить пространство имён mjin::application::sample на memory::colors::guide
** Ввести функцию memory::colors::guide::tearDownScene(), которая потребуется позднее
3. Собираем проект и удостоверяемся, что он работает
Выполняем команду:
~/mjin/projects/mjin/wale-build ~/mjin/projects mjin-player memory-colors-guide linux,web
4. Промежуточный результат
На текущий момент у нас тот самый куб, что мы получили в предыдущей части.
Текущие файлы:
* CMakeLists.txt
* main.cpp
Их содержимое: https://bitbucket.org/ogstudio-games/memory-colors-guide/src...
Веб-версия текущего результата: http://ogstudio.github.io/game-memory-colors/tutorial-3.1/mj...
СОЗДАНИЕ СТАРТОВОГО ЭКРАНА (Start)
1. Создаём класс Screens
Создадим класс Screens для управления экранами.
Обязанности Screens:
* перемещение между экранами
** переменные screen и screenReport
* создание и удаление экранов, подписка их на события
** функции setupStart(), enterStart(), leaveStart()
* ввод
** функции setupInput(), tearDownInput()
* сцена
** функции setupScene(), tearDownScene()
1.1. Перемещение между экранами
Перемещение между экранами контролирует пара меременных:
* SCREEN screen;
** SCREEN - это простое перечисление (enum) со всеми возможными экранами + отсутствие экрана (значение NONE)
* mjin::report::Variable screenReport;
** mjin::report::Variable (часть проекта mjin-report) является так называемой "сообщающей переменной".
** Цель сообщающей переменной в доставке сообщений, т.е. она является издателем сообщений (event publisher). Популярным подходом для рассылки сообщений обычно является наследование класса вроде EventBase и переопределение его методов для обработки событий. Вместо этого я решил реализовать систему рассылки и подписок в виде отдельных экземпляров. На мой взгляд, использование наследования для расширения функционала сущности является не самым лучшим способом. Поэтому я выбрал композицию вместо наследования.
** При изменении значения переменной screen тот, кто это изменение сделал, должен также вызвать screenReport.report() для оповещение заинтересованных в изменении участников.
1.2. Создание и удаление экранов, подписка их на события
Каждая смена экрана приводит к тому, что один из экранов становится видимым. Т.к. мы не хотим засорять память невидимыми экранами, мы будем создавать экран лишь при переходе на него. А при выходе с него будем этот экран удалять.
Следующие функции контролируют жизненный цикл экрана Start:
* setupStart()
** создаёт подписку на screenReport для получения уведомлений о смене экранов. Если подписка видит переход на экран Start, то она вызывает enterStart(). Если же подписка видит выход с экрана Start, она вызывает leaveStart().
* enterStart() создаёт экран, после чего настраивает его. Настройка включает в себя:
** добавление сцены экрана Start к графу сцены
** подписка на события ввода
** перевод на следующий экран после выхода с текущего
* leaveStart() отписывает экран Start от событий, после чего удаляет его
1.3. Ввод
Для получения ввода нам необходимо зарегистрировать mjin::input::Mouse (часть проекта mjin-input) в OpenSceneGraph в качестве обработчика событий (event handler). Мы используем mjin::input::Mouse для получения событий о нажатии кнопок мыши и изменении позиции курсора (позднее).
1.4. Сцена
Класс Screens содержит собственный граф сцены, который удаляется и добавляется в основной при каждой смене экрана. Данная операция заставляет камеру OpenSceneGraph центрироваться на всех объектах в сцене.
2. Используем класс Screens в main.cpp
Нам не нужен более куб. Нам нужно заменить код в setupScene() созданием экземпляра класса Screens. А в tearDownScene() добавить удаление этого экземпляра.
3. Создаём класс стартового экрана (Start)
Класс Start отвечает у нас за:
* отображение, метод setupScene()
* выход с экрана, метод setupExit()
3.1. Отображение экрана Start
Вместо старого скучного куба у нас теперь будет модная сфера!
Создание сферы делается одним вызовом mjin::scene::createSphere() (часть проекта mjin-scene). Эта функция создаёт сферу с заданным радиусом.
Вместо того, чтобы писать собственноручно шейдер для одного цвета, мы используем mjin::render::createSingleColorMaterial() (часть проекта mjin-application, который мы уже используем).
3.2. Выход с экрана Start
На текущий момент мы хотим выходить с экрана Start по нажатию на кнопки мыши. Для этого мы подписываем exitReport на mouseReport. Подписка в классе Screens делает уже непосредственную смену экранов при получении события от exitReport.
4. Добавление проектов mjin-input, mjin-report, mjin-scene в качестве зависимостей
Для того, чтобы собрать приложение с указанными проектами в качестве зависимостей, нам необходимо заполнить файл mjin.cfg, который нужно положить в корень нашего проекта.
Содержимое должно выглядеть следующим образом:
hg http://bitbucket.org/ogstudio/mjin-input
hg http://bitbucket.org/ogstudio/mjin-report
hg http://bitbucket.org/ogstudio/mjin-scene
5. Промежуточный результат
На текущий момент у нас должны быть следующие файлы:
* CMakeLists.txt
* mjin.cfg
* main.cpp
* Screens.h
* Start.h
Их содержимое: https://bitbucket.org/ogstudio-games/memory-colors-guide/src...
Веб-версия текущего результата: http://ogstudio.github.io/game-memory-colors/tutorial-3.2/mj...
Нажмите кнопку мыши, что приведёт к исчезновению сферы. Магия!
СОЗДАНИЕ ИГРОВОГО (Game) И КОНЕЧНОГО (Finish) ЭКРАНОВ
Пора создать два оставшихся экрана - Game и Finish. Они очень похожи на экран Start, но есть следующие отличия:
* Игровой экран (Game) содержит две сферы вместо одной
* Конечный экран (Finish) содержит три сферы, и с него нельзя выйти (нет exitReport)
РЕЗУЛЬТАТ
Теперь файлы должны быть следующие:
* CMakeLists.txt
* mjin.cfg
* main.cpp
* Screens.h
* Start.h
* Game.h
* Finish.h
Их содержимое: https://bitbucket.org/ogstudio-games/memory-colors-guide/src...
Веб-версия результата: http://ogstudio.github.io/game-memory-colors/tutorial-3.3/mj...
Нажимайте кнопку мыши на каждом экране, чтобы увидеть их смену.
ЗАКЛЮЧЕНИЕ
Мы создали заготовки трёх экранов и переходы между ними по нажатию кнопки мыши. Со следующей части мы начнём заполнять эти экраны.
Предыдущие части:
Часть 01. Функционал: https://pikabu.ru/story/sozdanie_nastolnoy_igryi_chast_01_fu...
Часть 02. Отображение куба: https://pikabu.ru/story/sozdanie_videoigryi_na_osnove_nastol...

