Я уже несколько дней бьюсь над этой проблемой и не пришел к каким-либо удовлетворительным выводам, поэтому решил, что я бы попросил команду SO за их мнение. Для игры, над которой я работаю, я использую объектную модель компонентов, как описано здесь и здесь . На самом деле все идет довольно хорошо, но мое текущее решение для хранения данных оказывается ограниченным (я могу запрашивать компоненты только по имени класса или по произвольному имени «семейства»). Что мне хотелось бы, так это возможность запрашивать данный тип и выполнять итерацию по всем компонентам этого типа или любого производного от него типа.
При рассмотрении этого вопроса я впервые реализовал простую схему RTTI, в которой тип базового класса хранится через производный тип в указанном порядке. Это означает, что RTTI для, скажем, спрайта будет: component :: renderable :: sprite. Это позволяет мне легко сравнивать типы, чтобы увидеть, является ли тип A производным от типа B, просто сравнивая все элементы B: то есть component :: renderable :: sprite получен из component :: renderable, но не component :: timer. Просто, эффективно и уже реализовано.
То, что я хочу сейчас, - это способ хранения компонентов таким образом, чтобы представлять эту иерархию. Первое, что приходит на ум, - это дерево, использующее типы в качестве узлов, например:
component
/ \
timer renderable
/ / \
shotTimer sprite particle
На каждом узле я буду хранить список всех компонентов этого типа. Таким образом, запрос узла "component :: renderable" даст мне доступ ко всем компонентам визуализации, независимо от производного типа. Проблема в том, что я хочу иметь доступ к этим компонентам с помощью итератора, чтобы я мог сделать что-то вроде этого:
for_each(renderable.begin(), renderable.end(), renderFunc);
и переберите все дерево от рендеринга вниз. У меня довольно много работы с использованием действительно уродливой структуры узлов карты / вектора / дерева и специального прямого итератора, который отслеживает стек узлов, где я был. Хотя все время я реализовывал, я чувствовал, что должен быть лучший, более ясный путь ... Я просто не могу думать об одном: (
Итак, вопрос в том, чрезмерно ли я это усложняю? Есть ли какое-то очевидное упрощение, которое я упускаю, или уже существующая структура, которую я должен использовать? Или это просто унаследованная сложная проблема, и я, наверное, уже хорошо справляюсь?
Спасибо за ваш вклад!