Возникла потребность в tween системе для игры. Почти вся логика в игре завязана на ecs. Использую библиотеку entt.
Идея появилась следующая: Сделал компонент с данными о твине.
struct TweenComponent
{
EasingType type;
float delay;
float fromValue;
float toValue;
float duration;
};
И накидал примерную часть системы, которая будет обрабатывать сущности, на которые был навешан компонент.
void update(entt::registry& registry, float dt)
{
auto view = registry.view<TweenComponent>();
for(auto entity: view)
{
auto tween = registry.get<TweenComponent>(entity);
...
}
}
Там где многоточие, я планировал реализовать логику изменения параметра в зависимости от функции интерполяции, которая выбрана в компоненте. Но тут как раз и непонимание. Как универсально сделать передачу через компонент нужного параметра, к которому будет применяться твин анимация? И сразу появилась проблема с тем, что на сущность мы можем навесить только один TweenComponent. А как быть с тем, что нужно будет анимировать сразу несколько параметров (например позицию и цвет)? В общем такая архитектура применения tween анимации как то не очень..
Может кто в курсе как лучше реализовать эту систему в рамках ecs?
Были мысли делать на каждый параметр сущности, который нужно анимировать, свой tween компонент (PositionTweenComponent, ColorTweenComponent). А потом в системе делать выборки по сущностям каждого типа. Так мы сразу будем понимать, какой параметр нужно доставать из какого компонента.
Еще были идеи передавать в TweenComponent в качестве одного из параметров некий handle, в котором описывать нужные действия над нужным параметром других компонентов. В общем подскажите пожалуйста, как это делается?