README.md 16 KB

Honourished v0.3.0dev

В создании принимают участие:

Разработчики:

  • Архипов Иван
  • Батманов Игорь
  • Боков Аркадий
  • Кологерманский Егор

Дизайнеры:

  • Безребрая Анастасия

Honourished представляет собой тактическую пошаговую стратегию с элементами rpg. В данный момент идёт разработка первого сценария игры: свободного сражения между двумя игроками. Сражение представляет собой последовательные действия игроков над их юнитами (предварительно выбранными) на поле из шестиугольников. За основу была взята механика боёв игры Heroes of Might & Magic III. Игроку доступны для выбора 2 расы: "Люди" и "Мёртвые", каждая из которых обладает собственным набором юнитов и разветвлённой системой их улучшения. Каждый юнит имеет уникальный набор способностей (умений), характеристик и специфики поведения.

Установка

Список доступных версий для установки с их описаниями и ссылками для скачивания доступен по ссылке: http://git.endevir.ru/GooseHouse/game-client/releases

Windows:

  • Скачать сборку, упакованную в .zip архив (ссылка на последнюю сборку: http://git.endevir.ru/attachments/2321e6b4-4236-4790-aae6-3b6c8ff6f7fc)
  • Распаковать всё содержимое архива в любую папку
  • Для запуска использовать файл game.exe

Linux Debian-based (Debian ver. >= 8, Ubuntu ver. >= 16.04 LTS, etc.)

  • Скачать .deb пакет с игрой (ссылка на последнюю сборку: http://git.endevir.ru/attachments/cd200ce0-0b53-430c-aaf0-c56944ba6ebf)
  • Выполнить команду:

    sudo apt-get -f install ./honourished-0.3.0dev-linux.deb
    
    • Для запуска использовать консольную команду honourished
    • В случае, если установка через apt-get -f install не удалась, выполните следующие действия вместо этой команды:
    sudo apt-get install libqt5core5a libqt5dbus5 libqt5glib-2.0-0 libqt5gstreamer-1.0-0 libqt5gui5 libqt5multimedia5 libqt5network5 libqt5svg5 libqt5widgets5 libqt5multimedia5 libqt5gstreamer-1.0-0 libqt5multimedia5-plugins gstreamer1.0-nice gstreamer1.0-plugins-good
    
dpkg -i ./goosehouse-game.deb

Структура директорий проекта:

Папка assets

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

Папка include

Эта папка содержит в себе все .h файлы приложения - все интерфейсы классов приложения (исключения - .h файлы, связанные с .ui сценами, они хранятся вместе с этими сценами)

Папка source

Здесь находятся все файлы реализации классов приложения, кроме тех, что завязаны на .ui файлах (аналогично с .h файлами, последние хранятся вместе с .ui сценами)

Папка ui

В папке ui размещены все файлы графических сцен проекта. Каждая сцена состоит из 3-х файлов - .ui, .cpp и .h. Одна логическая сцена (главное меню, к примеру), может состоять из нескольких физических, которые накладываются друг на друга (сцена анимированного фона, сцена меню, расположенного по центру)

Папка res

В ней находятся специальные файлы .qrc, содержащие информацию о тех файлах из /аssets, которые будут собраны в файлы ресурсов (.gtr)

Файл client.pro

Это основной файл qmake проекта, именно в нём прописаны скрипты сборки ресурсов, указаны собираемые файлы исходных кодов, подключаемые библиотеки и system-specific указания системе сборки qmake.

Описание архитектуры проекта:

  • Графическая часть: весь графический интерфейс приложения разделён на несколько сцен - групп элементов, одновременно отображающихся в определённый момент времени. Для каждой сцены создаётся её класс + файл графического интерфейса (.ui) для QtCreator, который при сборке преобразуется в заготовку кода, пригодную для компиляции. Каждая сцена наследуется от класса-прототипа Scene, который предоставляет интерфейс для инициализации сцены и передачи в неё аргументов для инициализации (именно посредством передачи аргументов осуществляется взаимодействие между сценами. Напрямую они никак не связаны. Для инициализации и переключения сцен создан класс-синглтон GuiSceneManager. Инициализация игровых ресурсов и графического интерфейса также является сферой ответственности класса GuiSceneManager и выполняется при первом вызове GuiSceneManager::getInstance (происходит в main.cpp). Ответственный: Архипов Иван

  • Звуковое оформление реализуется посредством использования внутренних библиотек Qt (Низкоуровневые библиотеки QSound + QPhonon и их высокоуровневая абстракция в виде QMediaPlayer). Для управления звуками созданы 2 класса: класс-синглтон SoundEngine (основной поток звука + весь интерфейс взаимодействия) и класс AsyncSound. Последний представляет собой объект для работы с "мгновенными" звуками (выстрел, звук наведения мыши на элемент и т.п.). Создание асинхронного звука также происходит в классе SoundEngine. Управление объектом AsyncSound разделяется между классом SoundEngine и объектом, вызвавшим звук. После того, как воспроизведение звука заканчивается, SoundEngine сбрасывает с себя владение объектом, и если вызывавший объект также сбросил владение, то объект AsyncSound удаляется. В противном случае время жизни объекта AsyncSound будет равно времени жизни указателя на него у класса, вызвавшего звук. Ответственный: Архипов Иван

  • Фабрика классов: Фабрика классов представляет собой гибкий инструмент для создания элементов и управления ими через заданный прототип. Это значительным образом упрощает управление игровыми объектами, коих создаётся множество (пример: юниты, эффекты и умения), т.к. фабрика скрывает процесс инициализации объектов и возвращает сразу готовый к использованию абстрактный интерфейс. Ответственный: Боков Аркадий

  • Игровая механика:

    • Управление игровым процессом происходит в классе-синглтоне GameManager. Его задача - инициализация и подготовка игрового процесса, хранение информации о действиях игроков и юнитах, передача хода (класс UnitsQueue) и построение игрового поля (классы Cell) Ответственные: Боков Аркадий, Кологерманский Егор, Архипов Иван

    • Игрок: За работу с игроками отвечает синглтон-класс PlayerManager. Он управляет количеством игроков, он же хранит у себя объекты классов Player и возвращает по требованию указатели на них. Класс Player содержит в себе информацию об игроке, указатель на расу игрока и указатели на юнитов. Предоставляет интерфейс для добавления, удаления и/или получения списка юнитов, смены расы или иных параметров игрока. Ответственный: Архипов Иван

    • Клетки: Класс Cell является мощной структурой, которая функционирует одновременно как и графический, так и логический элемент. В его ведении находятся отрисовка шестиугольника клетки, доступ к соседним клеткам и алгоритмы подсчёта расстояния до других клеток и поиска препятствий для перемещения или выстрела в другие клетки. Клетки создаются единой матрицей с собственной индексацией в процессе инициализации игры в классе GameManager. Ответственный: Кологерманский Егор

    • Расы и юниты: Аналогично связке PlayerManager-Player для работы с расами в игре используется связка классов RaceManager-Race. RaceManager создаёт и хранит у себя единственные (уникальные) объекты рас и передаёт классу Player по требованию указатель на расу. Класс Race отвечает за создание юнитов заданной расы. Его задача - получить список юнитов (из соответв. директории в /assets), инициализировать фабрику юнитов и создавать их по требованию. Объекты каждой расы существуют в единственном экземпляре в классе RaceManager. Класс Unit претерпел серьёзные изменения с момента реализации первого задания. Первоначально предполагалось, что у каждого юнита будет прописана его логика основного взаимодействия с окружающим миром (перемещение, стандартная атака), которые будут варьироваться в зависимости от механики юнита (абстрактный пример: перемещение грифонов не учитывает препятствия, т.к. они летают. Атака лучников может производиться на расстоянии >1 клетки от цели). В настоящий момент мы перешли к идее "Всё в мире - это умение (см. раздел эффекты и умения)", которая предполагает, что абсолютно все действия юнита - это умения, а все изменения, которые могут происходить с юнитами и клетками - это эффекты. В таком подходе структура класса Unit стала очень легковесной и сводится, по сути, к простому хранению характеристик и наложенных эффектов. Отвественный: Боков Аркадий

    • Умения и эффекты: Умения и эффекты предоставляют главный функционал динамического изменения состояния юнитов. Каждое действие юнита (перемещение, атака, fireball, выстрел из лука) - это умение. Структурно умение представляет собой набор накладываемых эффектов и механику их наложения. Именно умение распределяет эффекты по юнитам и клеткам в соответствии с тем, как этого требует концепция умения (например: умение "Армагеддон" накладывает эффекты мгновенного урона, горения, смены анимации на всех юнитов). За создание эффектов и умений отвечает класс SpellManager. Эффектом является любое фундаментальное действие, происходящее с юнитом. Изменение характеристики (дебафф/нанесение урона), смена анимации, перемещение (длительная смена координат), создание временного объекта (создание и полёт фаерболла, стрел), наложение другого эффекта и т.п. - всё это находится в ведении эффекта. Эффекты делятся условно на несколько специализаций: моментальные эффекты, длительные, отложенные, эффекты-на-юнитах, эффекты-на-клетках. Длительные эффекты могут обрабатываться после каждого действия или хода. (В одном ходе юнита может быть несколько действий. Действие == умение: перемещение, атака, кинуть фаерболл). Ответственный: Батманов Игорь