Сохранение «новых» объектов из копий с использованием шаблонных функций c ++ - PullRequest
0 голосов
/ 25 декабря 2018

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

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

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

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

//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));

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

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

...