Я работал над очень тонкой системой Entity Component System в javascript, используя Pixi.js на веб-интерфейсе, и у меня возник вопрос к вам, ребята
Распространенным шаблоном являются итераторы, которые вы используете в системах, например, в Unity вы можете сделать:
[ComponentType1, ComponentType2],
(c1: ComponentType1, c2: ComponentType2) => {
// run ops on the components
})
Как бы вы разработали эту функцию forEach изнутри, учитывая, что у вас есть массив сущностей и два массива, содержащие эти типы компонентов, для которых необходимо вызвать функцию и передать эти два компонента в качестве аргументов? По сути, каков наиболее оптимизированный способ перебора объектов, имеющих компоненты обоих типов?
Кажется, простым способом является итератор по списку сущностей и проверка типов их компонентов, но мне интересно, есть ли лучший способ. Такой подход будет выглядеть примерно так:
function forEach<T, K>(components: [c1: T, c2: K], callback: (c1: T, c2: K)=> void) {
entities.forEach((entity) => {
if (entity.hasComponent(c1) && entity.hasComponent(c2)) {
callback(entity.getComponent(c1), entity.getComponent(c2)
}
}