Тема: Танчики
Показать сообщение отдельно
Старый 28.01.2008, 16:41   #192
Новичок
 
Аватар для L'ombre
 
Регистрация: 07.03.2006
Адрес: !here();
Сообщений: 38
Репутация: 26 [+/-]
вот опять тема затихла. где все? мне нужна минута внимания

итак, я сделал ядро игры. реализовал ту ранее описанную концепцию.
(при этом концепция подверглась некоторой "эволюции", но основные идеи - те же)
сейчас тестирую эту реализацию,
основные баги отловлены, ядро ведёт себя так, как должно.
насколько мне известно..

кое-что еще не реализовано в ядре
(например, изменение скорости танка в зависимости от местности),
но будет добавлено в ближайшее время
(или не в ближайшее.. посмотрим)

подробную документацию я ещё не делал
(есть только коментарии в коде - правда их относительно много)
краткое описание - как им пользоваться, не вдаваясь в детали - приведу сейчас
Скрытый текст:

Итак, нужно создать уровень; т.е. экземпляр класса 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)

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


ядро можно взять тут:
Скрытый текст:

http://ifolder.ru/5136618
пароль у архива t@nk$c0re

core.cpp и core.h - собственно всё, что относится к ядру.
tiny_implementation.h/.cpp - простейший пример вышеописанных фабрик
test.cpp - программа, которая это использует.
она создаёт всё что нужно для уровня, потом сам уровень, выполняет один такт (в котором ничего не происходит) и освобождает память в правильном порядке. Т.е. запускать её нет особого смысла. (если же захочется, то при желании каждый сможет сделать из этих файлов проект в visual studio)
__________________
Use the Darkness that you have inside
L'ombre вне форума