|
Новичок
Регистрация: 07.03.2006
Адрес: !here();
Сообщений: 38
Репутация: 26
|
разработал черновой вариант концепции ядра игры. этот черновик может лечь в основу диздока, той его части, касающейся ядра.
Скрытый текст:
основные сущности в игре:
- уровень, он же interaction manager, в дальнейшем - Level
Управляет взаимодействием всех сущностей
- матрица. состоит из элементов. что очевидно..
- элемент матрицы. CellItem. то, из чего состоит матрица.
- более сложные сущности, в основе которых лежит так называемый Traverser -
это нечто, способное двигаться относительно матрицы.
Оно имеет координаты и направление
при этом остальные объекты матрицы могут оказывать влияние на это движение.
существует два основных подвида Traverser'а:
- MatrixTraverser - это объект, движущийся относительно матрицы И
привязанный к матрице, оставляющий в ней след, имеющий размер.
т.е. вместе с движением объекта перемещается его представление в матрице
- PointTraverser - безразмерный объект, движущийся относительно матрицы И НЕ
оставляющий в ней след (но при этом взаимодействует с остальными объектами)
т.е. объект движется, но не имеет представления в матрице
Таким образом, Танк - это такой специальный MatrixTraverser,
умеющий стрелять, проезжающий по определённым клеткам и не умеющий по остальным и тд.
Снаряд - это PointTraverser, с соответствующими свойствами
Ближе к деталям:
Абстрактные сущности.
Destroyable
Сущность материальная, которую можно разрушить
свойства:
- Armor. Броня, Порог прочности.
определяет взаимодействие с PointTraverser'аим (снарядами)
Чтобы нанести повреждение, нужно, чтобы мощность снаряда была не меньше.
Если броня равна нулю, то снаряды пролетают сквозь этот объект.
- HitPoints. Численное прдставление прочности.
если снаряд пробил броню, то HitPoints уменьшаются.
При достижении значения 0 объект разрушен и исчезает из матрицы
(т.е. заменяется на пустой)
данное свойство показывает текущее значение
- MaxHitPoints - а это максимальное значение Hit Point'ов данного объекта.
Traverser
это нечто движущееся относительно матрицы. Основные свойства:
- X,Y. координаты центра в матрице
- Direction. Направление, одно из четырёх.
- Speed/Delay - так или иначе задаёт скорость
MatrixTraverser
Обладает размером. В общем случае прямоугольный.
- Width, Height - размеры, в клетках матрицы.
Какой ячейке соответствуют координаты, надо решить позже.
Предположительно, той, что ближе к центру.
например, если координата объекта шириной Width == 4 X == 2,
то этот объект занимает ячейки матрицы 1, 2, 3, 4 (нумерация, естественно, начинается с нуля)
(естественно это не окончательное решение)
- ID - может быть некий тип, но пока необязательно..
PointTraverser
на данный момент ещё не решил, должен ли он отличаться просто от Traverser'а,
кроме смысла. А по смыслу - это предок всех снарядов.
Скорее, будут отличаться обработчики событий.
PointTraverser движется иначе. А именно - МЕЖДУ ячейками
(т.е. координаты интерпретируются по-другому)
например, если координата X == 2, то объект находится между второй и третьей ячейкой.
Неабстрактные сущности
CellItem
Элемент (ячейка) матрицы. Потомок Destroyable
дополнительные свойства:
- Passability. Проходимость.
определяет взаимодействие с MatrixTraverser'аим (танками)
(вещественное число. 0 - объект непроходим; отличное от нуля значение влияет на скорость;
1 - нормальная скорость; 0.5 - замедленная в два раза, 2 - удвоенная и тд)
поскольку некоторые клетки могут быть доступны для MatrixTraverser'ов,
для представления этого понадобится ещё одно поле, пусть будет
- Meta. Флаг, который каким-либо образом показывает,
что эта ячейка занята каким-то MatrixTraverser'ом.
Например, порядковый номер танка (индекс в контейнере танков)
Для ядра игры этих свойств достаточно. Для визуализатора понадобится ещё хотя бы одно -
- ID. Уникальное число, идентификатор этого объекта.
Если все взаимодействия определяются вышеописанными свойствами,
то это поле определяет, как нужно объект отрисовывать.
склоняюсь к тому, чтобы не делать сложной иерархии классов для объектов матрицы;
просто все объекты принадлежат к одному классу и отличаются набором свойств.
тогда можно задавать все объекты в рантайме - например, загружать из файла.
Tank
танк является потомком MatrixTraverser'а и Destroyable
(т.е. это объект, способный двигаться в матрице, который можно уничтожить)
со своим набором свойств
- Weapons. вектор орудий. об этом позже.
- Owner. кто этим танком командует. номер игрока, флаг игрок/AI и тд
Missile
потомок PointTraverser'а.
специфические свойства:
- AttackPower. "Пробивная сила". Сравнивается с Armor объектов и танков.
- Damage. Повреждения, наносимые объектам, после того, как пробита броня.
- DamageDepth, DamageWidth - определяют область, затронутую взрывом
- Charges. Свойство, призванное обобщить концепцию снаряда.
Это "количество зарядов" - сколько раз снаряд может взорваться.
То есть, снаряд, после того, как он столкнулся со стеной и взорвал её,
может полететь дальше. Звучит абсурдно для снаряда, но это может быть лазер
или плазменный шар. При достижении количества 0 снярад уничтожается.
(если броня не пробита, или же хитпойнтов оказалось слишком много,
то не важно, сколько зарядов - снаряд уничтожается)
- Owner. Танк, выпустивший этот снаряд. Это понадобится для обработки Friendly Fire -
смогут ли танки противника повреждать дуг друга.
Остальные сущности
Weapon.
Оружие танка. определяется свойствами:
- Тип снаряда. идентификатор (если у снарядов будут идентификаторы)
или собственно указатель на объект.
- Скорострельность. - это максимальное количество снарядов, выпущенных из этого орудия,
которые могут существовать в каждый момент времени.
Например, если 1 - то танк не может выстрелить, пока не взорвётся выпущенный ранее снаряд.
и т.д.
У танка может быть несколько орудий, между которыми можно переключаться.
Делать заканчивающиеся снаряды, думаю, нет смысла.
Explosion
Столкновение снарядов с чем-либо, обладающим ненулевой бронёй,
порождает экземпляр этого класса.
Возможно, нет смысла делать эту сущность, так как решающую роль будет играть метод,
вызываемый во время взрыва. Этот метод обходит все ячейки и танки, и сообщает им,
что с ними случилось,
т.е. какой атаке они подверглись, какие повреждения могут получить итд.
Наличие объекта этого класса может быть полезно для отрисовки
RespawnPoint
точка возрождения. так как это точка, то это просто потомок какого-нибудь Traverser'а
PowerUp
объект, имеющий размер, при "столкновении" с которым танк получает какой-либо бонус:
- новое оружие
- усиление брони или HP
и тд
потомок MatrixTraverser'а, хоть и не движется. Основное свойство - тип бонуса.
BaseStation
(название надо обдумать)
это такой объект, который вражеские танки стремятся уничтожить.
опционально. тоже потомок MatrixTraverser'а и Destroyable
Структура игрового процесса
Основная сущность:
Level, уровень.
основные элементы:
- Матрица
- Вектор танков.
- Список снарядов
дополнительные:
- контейнер точек возрождения
- контейнер powerup'ов
- "базовая станция", которую нужно защищать.
(к контейнеру танков потребуется произвольный доступ,
а объекты из контейнера снарядов должны легко удаляться)
игровое время дискретно. каждую единицу времени каждый активный объект выполняет некое
элементарное действие - сдвинуться по ходу движение на некоторое число клеток
(определяемое скоростью. или же, если скорость слишком маленькое, пропустить этот момент),
повернуться или выстрелить.
Движение порождает события - вызывается метод движущегося объекта, в котором принимается
решение, может ли он сдвинуться и что с ним после этого произойдёт.
Двигаться могут танки - находящиеся в одном списке - и снаряды - в другом.
Выстрел любого танка добавляяет его снаряд в список снарядов.
Танк может добавить в список несколько снарядов.
попадание снаряда во что-либо может удалить его из этого списка.
Попадание в танк может его уничтожить - уничтоженный танк не удаляется из контейнера,
так как возможен respawn - этот экземпляр будет перемещён в другое место и "воскрешён"
(если закончились все танки в "запасе",
то этот танк просто пропускается при дальнейшей обработке).
небольшой пример взаимодействия:
Скрытый текст:
допустим, снаряд перемещается на одну ячейку вперёд.
Некий метод уровня вызывает метод снаряда OnMove,
который смотрит, что находится в новой точке
там оказывается слой кирпича. Поскольку у кирпича есть броня, не равная нулю,
то создаётся объект Explosion. вызывается метод Run этого объекта;
туда передаётся снаряд, породивший взрыв. Этот метод определяет зону, затронутую взрывом,
и вызывает для каждой ячейки метод OnExplosion.
Этот метод (у каждой ячейки) анализирует параметры снаряда и сопоставляет их со своими параметрами. Поскольку это крипич, броня его меньше, то он должен повредиться.
Damage снаряда достаточно высок, и весь слой просто взрывается - то есть каждая ячейка
трансформирует себя в пустую ячейку.
управление возвращается в OnMove снаряда,
и там уменьшается на единицу зачение Charges;
получившееся значение возвращается в вызывающий метод уровня,
оказывается, что это 0, значит снаряд нужно уничтожить. Снаряд удаляется из списка.
Цитата:
Сообщение от ORTODOX
L'ombre
Кто ты? Т.е кем будешь?
|
я - ваш кошмар! 
не знаю, будет ли у меня время реализовать всё это. Скорее всего, программить вышеописанное придётся кому-то из вас.
так что мне логичнее стать консультантом
__________________
Use the Darkness that you have inside
Последний раз редактировалось L'ombre; 20.01.2008 в 23:46.
|