Сохранение "новых" объектов из копий с использованием шаблонных функций C++
Моя идея: я хочу иметь возможность создавать новые сущности с копиями из компонентов, передаваемых в качестве параметров, а также с использованием шаблонных функций с переменным числом элементов для неопределенного количества компонентов.
Причина: я хочу простой способ создания новых сущностей во время выполнения.
Проблема: Мой исходный код не создавал копии компонентов, а вместо этого использовал ссылки и сохранял указатели в массиве компонентов. Кроме того, требуемый код является слишком сложным для меня с моими текущими знаниями. Помощь приветствуется.
Идеальный код:
//Creating components
TransformComponent a;
a.SetPosition(50, 50);
RenderComponent b;
b.SetColor(0.5f, 0.5f, 0.0f, 1.0f);
//Creating entities
EntityHandle entity1 = CreateEntity(a, b, ...); //Undefined amount of components
//Assign new values
a.SetPosition(100,100);
b.SetColor(0.5f, 0.5f, 0.0f, 1.0f);
EntityHandle entity2 = CreateEntity(a, b, ...);
//New entity has a copy of the same components
//used when creating the first entity,
//without changing the values of the first entity
Моя попытка пока: (работает при передаче ссылок на компоненты)
TransformComponent tTest;
tTest.transform.SetPosition(200.f, 200.f);
RenderComponent rTest;
rTest.texture = &texture;
ecs.CreateEntity(&tTest, &rTest);
//Creating an entity with undefined number of arguments
template <class... Component>
EntityHandle CreateEntity(Component*... componets)
{
EntityHandle newEntity = CreateEntity();
AddComponent(newEntity, componets...);
return newEntity;
}
void DestroyEntity(EntityHandle handle);
//component methods
template<class Component, class... Args>
void AddComponent(EntityHandle handle, Component* component, Args*... args)
{
AddComponent(handle, component);
AddComponent(handle, args...);
}
template<class Component>
void AddComponent(EntityHandle handle, Component* component)
{
AddComponentInternal(handle, ECSComponent<Component>::familyID, (BaseECSComponent*)component);
}
Я использую систему Entity-Component-System, а EntityHandle - это ссылка на идентификатор объекта.
CreateEntity возвращает идентификатор объекта. Сначала я вызывал AddComponent(entityHandle, &component) для добавления новых компонентов (они сохраняются как указатели в моей системе ECS), но это раздражало, когда я начинал создавать объекты во время выполнения и когда я хотел создать много объектов в цикле.
Возможное решение?:
Создайте новые объекты с ключевым словом "new":
EntityHandle entity = CreateEntity(new TransformComponent(position), new RenderComponent(color));
Это, однако, требует, чтобы все мои компоненты структуры имели конструкторы, которые устанавливают все его значения.
РЕДАКТИРОВАТЬ: Я мог бы быть совершенно не прав здесь, но я думаю, что я спрашиваю о том, как "преобразовать" объект стека в объект кучи, и это предположительно невозможно?