Моя идея:
Я хочу иметь возможность создавать новые сущности с копиями из компонентов, передаваемых в качестве параметров, а также с использованием шаблонных функций с переменным числом элементов для неопределенного количества компонентов.
Причина: Я хочу простой способ создания новых объектов во время выполнения.
Проблема: Мой исходный код не создавал копии компонентов, но вместо этого использовал ссылки и сохранял указатели в массиве компонентов. Кроме того, требуемый код является слишком сложным для меня с моими текущими знаниями. Помощь приветствуется.
Идеальный код:
//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));
Это, однако, требует, чтобы все мои компоненты структуры имели конструкторы, которые устанавливают все его значения.
РЕДАКТИРОВАТЬ:
Я могу быть совершенно неправ здесь, но я думаю, что то, о чем я прошу, — это способ «преобразовать» объект стека в объект кучи, а это предположительно невозможно?
Задача ещё не решена.
Других решений пока нет …