Компоненты — Сохранение & quot; новое & quot; объекты из копий с использованием шаблонных функций переполнения стека

Моя идея:
Я хочу иметь возможность создавать новые сущности с копиями из компонентов, передаваемых в качестве параметров, а также с использованием шаблонных функций с переменным числом элементов для неопределенного количества компонентов.

Причина: Я хочу простой способ создания новых объектов во время выполнения.

Проблема: Мой исходный код не создавал копии компонентов, но вместо этого использовал ссылки и сохранял указатели в массиве компонентов. Кроме того, требуемый код является слишком сложным для меня с моими текущими знаниями. Помощь приветствуется.

Идеальный код:

//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, &компонент), чтобы добавить новые компоненты (они сохраняются как указатели в моей системе ECS), но это стало раздражающим, когда я начал создавать объекты во время выполнения и когда я хотел создать много объектов в цикле.

Возможное решение?:

Создайте новые объекты с ключевым словом «new»:

EntityHandle entity = CreateEntity(new TransformComponent(position), new RenderComponent(color));

Это, однако, требует, чтобы все мои компоненты структуры имели конструкторы, которые устанавливают все его значения.

РЕДАКТИРОВАТЬ:
Я могу быть совершенно неправ здесь, но я думаю, что то, о чем я прошу, — это способ «преобразовать» объект стека в объект кучи, а это предположительно невозможно?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]