我正在制作一个实体/组件系统,我在制作一个可以根据其继承的组件选择实体的功能时遇到了一些问题。我们来举个例子:
Animal (1)
Dog (2)
Doberman (3)
Rottweiler (3)
Cat (2)
Siamese (3)
Persian (3)
如果你不熟悉实体组件系统,那么假设我想要一个名为“Rex”的杜宾犬,我会做类似的事情:
let Rex: Entity = createEntity("Doberman");
杜宾犬组件延伸至Dog,而Dog延伸至Animal。因此Rex接收所有这三个组件的属性。
现在,当我想选择具有Animal组件的所有实体(即“selectEntities(Animal)”)时,我还想选择Dogs,Cats,Dobermans等。换句话说:所有继承的组件。这就是我被困住的地方,因为它必须是动态的,并且考虑到任何继承组件链,无论它有多少级别。在我的第一个版本中,组件只能由一个其他组件继承,这使得一个简单的循环成为浏览所有实体的简单解决方案。
现在一个特定的组件仍然可以扩展到另一个组件(Dog to Animal),但它可以通过无数个组件扩展(Dog来自Doberman和Rottweiler)。我无法弄清楚如何从父母那里获得所有组件。仅仅是循环的重叠/互锁是否可行?
感谢。
答案 0 :(得分:0)
我误解了原来的问题。问题应该是“如何迭代嵌套对象?”,这有一个简单的解决方案:递归调用。
所以我们可以这样做:
public getInheritedComponents(component: string) : object {
let inheritees: object = {};
let current : Component = this.getComponent(component);
for (let inheritee in current.inherited) {
inheritees[inheritee] = current.inherited[inheritee];
let subinheritees = this.getInheritedComponents(inheritee);
for (let subinheritee in subinheritees) {
inheritees[subinheritee] = subinheritees[subinheritee];
}
}
return inheritees;
}
当天的教训是:“不要在黄昏时解决逻辑问题,让夜晚过去。” :)