Я разрабатываю игру, точнее движок для игр. http://star-engineers.blogspot.ru/ И сегодня обдумывал метод реализации взаимодействия объектов и придумал систему их взаимодействия. Хочу задать вопросы. Как это дополнить и усовершенствовать? Есть ли модели получше?
Описание.
Каждый присоединяемый к части юнита в соответствующий слот модуль регистрируется в специальном поле части юнита как исполнитель определённого типа действий, манипулятор, инструмент, оружие, распылитель фермента и прочее.
При получении приказа исполнения функции, модуль если может, генерирует агента. Агент это нуль-контейнер для передаваемой вещи, м-контейнер для монтажа модуля на другого юнита, облако аэрозоля, луч, снаряд, ЭМП-удар. То есть агент является дополнительным объектом определяющим метод доставки действия к цели.
При доставке действия к цели, происходит событие зависящее от типа агента. При этом все модули и части юнита зарегистрированные как получатели определённого вида агента получают сначала сигнал на предварительную обработку, в процедуре которой просто рассчитываются для некоторых видов агентов геометрические параметры, грубо говоря угол попадания который рассчитывается сложением и наложением геометрических свойств слота для модуля и самого модуля. Если тип агента не нуждается в предварительной геометрической обработке или найден модуль который находиться с нужной стороны (трёхмерные угловые координаты в радианах например можно использовать), то далее уже на каждый попавший под действие модуль по очереди (если конечно не тип агента не бьёт по площади) происходит действие.
Действие уже является массивом содержащим тип действующего фактора и его количественные характеристики. Например концентрацию ферментного облака, мощность луча, калибр снаряда, энергию снаряда, плотность снаряда. При прохождении через модуль, он может гасить различные поражающие факторы в зависимости от своих параметров «прочность» и «стойкость». Но если модуль является специальным, то он может выполнить произвольную модификацию параметров действующих факторов. Например лист композитной брони сильно погасит кинетический удар снаряда, точнее преобразует его в импульс.
То есть понадобиться все модули частей юнита зарегистрировать в массивах 3х типов. Массивы функций, например массивы «манипуляция» и «атака», в каждом из которых ссылки на те модули которые могут обеспечить эти функции. Массивы агентов, то есть на каждый тип агента обрабатываемого особым образом, есть такой массив. Например, если у машины нет брони, то пули будут просто на неё действовать уменьшая прочность модулей и частей. Но если на ней есть «броня», то эта броня регистрируется как перехватчик таких агентов и создаётся соответствующий указанным агентам массив. И массив особой обработки действий.
Собственно регистрация нужна что бы при каждом взаимодействии или приказе не приходилось устраивать полный перебор всех модулей. То есть это скорее метод оптимизации и предварительного кэширования такого поиска.