Итак, нужно создать уровень; т.е. экземпляр класса Level.
чтобы это сделать, нужно создать основные составляющие компоненты уровня.
это:
- матрица
- фабрика ячеек
- фабрика танков
- фабрика орудий
- менеджер (диспетчер, так сказать) респауна
всё остальное уровень будет создавать и удалять сам
возможно, кому-то покажется, что компонентов для уровня много.
но это следствие того, что ядро я хотел сделать как можно более общим,
независимым от конкретных, скажем так, правил игры.
по порядку про эти сущности. с матрицей, думаю, всё ясно.
понятие "фабрика" - довольно распространённый приём в дизайне.
поясню на примере ячеек матрицы.
вот ячейка. у неё есть несколько свойств: проходимость, броня, хитпойнты.
мы берём один набор этих свойств - скажем, со значениями (1, 0, 0)
и говорим, что это "пустая ячейка".
Когда в дальнейшем нам понадобится пустая ячейка,
нужно будет просто вспомнить эти три значения. Вместо слов "пустая ячейка"
можно использовать числовой идентификатор.
Фабрика ячеек как раз занимается созданием ячеек заданных типов.
т.е. ей передаётся ID ячейки, и она отвечает,
какие должны быть остальные свойства.
В ядре это используется, например, так:
ячейка взрывается, на её место нужно поместить другую. какую? -
ту, что указана в матрице как default ID.
Уровень обращается к фабрике ячеек и говорит:
"трансформируй эту ячеку в ячейку с DefaultID"; и фабрика трансформирует.
для аналогичных целей используются и остальные фабрики -
танков, снарядов и орудий. (фабрика снарядов нужна для создания фабрики орудий)
уровню всё равно _как_ фабрики создают свои объекты
(параметры конструктора - абстракные классы)
для нормальной работы нужно разработать фабрики самостоятельно,
они должны быть потомками этих абстрактных классов и
уметь создавать объекты по их идентификатором.
Соответственно, сами эти объекты тоже надо придумать и
назначить им соответствующие идентификаторы
(скажем,
кирпич - это id=1, passability=0, armor=1, hp=1
камень - id=2, passability=0, armor=2, hp=1
и тд. или как-то иначе.)
это, вообще говоря, задача гейм-дизайнера.
я предлагаю такой подход: каждый уровень может иметь свою таблицу объектов,
она хранится в каком-либо файле вместе с уровнем.
Но это я забегаю вперёд, сейчас об этом говорить ещё рано.
RespawnManager есть уже в готовом виде.
(но весьма вероятно, я его интерфейс переделаю.
там есть одна неоднозначность;
кстати, "упражнение" - найдите её!)
но его тоже, при желении, можно переопределить..
в него надо добавить несколько точек,
и тогда уровень будет создавать там танки
итак, перед созданием уровня, нужно:
- написать классы для фабрик
(пример - очень простой и маленький - tiny_implementation.cpp/.h)
- самостоятельно создать сущности всех нужных классов
(ну а при завершении программы удалить всё это, в правильном порядке)
после создания уровня им можно пользоваться.
под "пользоваться" имеются в виду три основные вещи:
- давать танкам различные команды
- осуществлять переход между состояниями уровня
(во время перехода эти команды выполняются)
- рисовать уровень на экране
переход между состояниями выполняет метод Сlock();
его надо вызывать в цикле, примерно так:
Код:
while (игрок не хочет выйти)
{
передать танкам команды, от игрока и искуственного интеллекта;
level->Clock();
отобразить все объекты уровня на экране.
}
объекты уровня - пока четырёх типов:
- танки, доступ через level->Tanks()
танками (и только ими) можно управлять, например:
level->Tanks()->at(0)->OrderMove(); // говорит танку: нужно сдвинуться вперёд
- снаряды, доступ через level->Missiles()
- взрывы, доступ через level->Explosions()
ячейки матрицы, доступ через level->Matrix->Item(x, y)
у них всех есть координаты, идентификаторы и тд.
задача движка - рендерить соответсвующие объекты в соответствующих местах.
где именно создаются взрывы, какие ячейки при этом трансформируются,
какие танки погибают и какие снаряды взрываются -
за всем этим следит сам уровень.