Abigon / skillbox-patterns

Работа по созданию паттернов в рамках курса Skillbox

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

SkillboxPatterns

Использована версия UE 4.26.2 Все результаты выводятся в логе LogTemp Для проверки все паттерны поочередно запускаются в методе StartPlay() класса ASkillboxPatternsGameMode (наследник AGameModeBase). Для упрощения весь код написан в h файлах. cpp сгенерированы UE.

Пораждающие паттерны

Абстрактная фабрика (Abstract Factory)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\AbstractFactory

Задача: В зависимости от платформы (Steam, iOS или Android), на которой играет игрок, Требуется:

  • отправлять сообщения в чат
  • размещать результат игрока в топе игроков платформы
  • отмечать выполненными ачивки на платформе игрока

Созданы бызовые классы BaseChat, BaseTop и BaseAchievement с витруальными методами. От базовых классов наследованы дочерные классы для каждой из платформ. В них переопределены методы. Для теста они лишь выводят сообщения в лог.

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

Определена переменная PlatformType, которая позволяет менять платформу прямо в Блюпринте.

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

Строитель (Builder)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Builder

Задача: Создавать различных мобов / боссов, которые могут иметь или не иметь следующие параметры:

  • Оружие в левой руке
  • Оружие в правой руке
  • Броню
  • Щит
  • Обычную атаку
  • Магическую атаку
  • Патрулировать территорию
  • Искать игрока на территории

Создан класс Enemy, который необходимо будет создавать для появления мобов. Создан класс EnemyBuilder, имеющий пустые виртальные методы. От него наследованы классы MobBuilder и BossBuilder. Создан класс EnemyDirector, в котором преднастроено создание трех видов врагов.

Прототип (Prototype)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Prototype

Задача: Генерировать лут по заранее заготовленным шаблонам:

  • Малая банка здоровья
  • Большая банка здоровья
  • Переносной источник света

Создан базовый клас PrototypeItem, который имеет виртуальным метод клонирования. От него наследованы класс LightItem и HealthPoitonItem, в кооторых переопределены методы клонирования и добавлены специфичиские для этих классов параметры. Создан класс LootManager, который хронит образцы лута. В нем создан метод GetNewLootItem, который возвращает копию предмета заданного типа.

Одиночка (Singleton)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Singleton

Создан класс для коннектора. В классе определен метод Get(), который возвращает ссылку сам на себя. При проверки выводится сообщение о создании класса. Для проверки в методе StartPlay() класса ASkillboxPatternsGameMode добавлен вызов функции InitConnect() и переопределил BeginPlay() в классе Character-а.

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

Структурные паттерны

Компоновщик (Composite)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Composite

Создан интерфейсный класс UUnit. Класс Лист - USoldier и Класс Композит - USquad. При запуске создаеются 3 солдата, 2 из них объединяются в отряд. Релизованы разные варианты движения солдат в точку (по одиночке, отрядом, одинм солдатом, входящим в отряд).

Мост (Bridge)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Bridge

Создан интерфейсный класс UWeapon. От него наследованы 2 реализации URifle и URocketLauncher. Классом абстракции является USoldier. Позволяет различным солдатам прикреплять различное оружие и управлять им. Под управление оружием также расширен и USquad.

Фасад (Facade)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Facade

Есть лук (UBow) и стрела (UArrow). Для упращения работы создан Фасад (UBowArrowShot). При запуске игры создается фасад, производится выстрел и прячется лук

Заместитель (Proxy)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Proxy

Создан Заместитель UBowArrowShotLog для класса UBowArrowShot, который ведет лог выполнения операций. Результ лог выводится при уничтожении объекта

Адаптер (Adapter)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Adapter

Создан Адаптер для класса UBowArrowShot, чтобы его можно было использовать Unit (из паттерна Компоновщик) как оружие. Условно был сделан адаптер от лука к огнестрельному оружию.

Легковес (Flyweight)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Flyweight

Создан "тяжелый" класс UItemImage и Фабрика экземпляров этого класса UItemImageFactory. Фабрика создает объекты нужного типа только при их отсутствии. Для использования UItemImage разширен класс UPrototypeItem из паттерна Прототип. Объекты лута имеют ссылку на картинку для этого отображения этого лута.

Лог этого прототипа показывает сколько типов объектов есть в массиве и выводится перед логом Прототипа.

Поведенческие паттерны

Посетитель (Visitor)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Visitor

Создан интерфейсный класс UVisitorTemp. От него наследована реализации UHealVisitor, которая лечит наследников класса UUnit. Сооветствущие функции добавлены и в UUnit и его наследников.

Состояние (State)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\State

Создан интерфейсный класс UState. От него наследованы 2 состояния UNormalState и UOverlappedState. Создан примитивный ATestActor, который имеет сферу коллизиии и отрисавывается с помощью debug-линий. ATestActor имеет 2 состояния - свободный и пересеченный игроком. Классы состяний имеют свои переопределенные методы, которые работают по разному в зависимости от состояния. При пересечении сферы игроком у сферы меняется цвет (возвращает класс состояния) и выводится сообщение в лог (выводит класс состояния).

Шаблонный метод (Template Method) и Наблюдатель (Observer)

Для демонстрации паттернов от класса ATestActor наследован ANewTestActor у которого расширен функционал. В классе создана Сигнатура и Переменная. Также переопределен метод смены состояний. Теперь при смене состояния вызывается обработчик для подписчиков на событие.

На карте размещены по 2 экземпляра объектов ATestActor и ANewTestActor. Для удобства у вторых болеше радиус.

В классе ASkillboxPatternsCharacter в методе BeginPlay() призводится подписка на собитие смены состояния сфер на карте. При пересечении игроком сферы происходит тряска камеры. При пересечении мылых сфер тряски камеры нет.

Команда (Command)

Код находится в папке \SkillboxPatterns\Source\SkillboxPatterns\Command

Создан интерфейсный класс для команд UCommand. От него наследованы 2 команды USaveGameCommand и ULoadGameCommand. В командах определен Получатель и реализован вызов необходимых функций получателя. Простые команды могуь выполнять действия сами без получателя. В классе ASkillboxPatternsGameMode определены функции для загрузки и сохранения игры, которые и вызываются командами.

В классе ASkillboxPatternsCharacter сделана привязка для клавиш L (Загрузка) и O (Сохранение). При запуске игры создаются и присваиваются команды для сохранения и загрузки. Эти команды и вызываются при нажатии клавиш.

Точно также можно вызывать команды, допустим, из меню.

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

About

Работа по созданию паттернов в рамках курса Skillbox


Languages

Language:C++ 98.2%Language:C# 1.6%Language:C 0.1%