2017-05-04 60 views
0

我正在制作一个实体/组件系统,并且遇到了一些问题,可以根据它们的继承组件来选择实体。让我们举个例子:如何浏览继承系统?

Animal (1) 
    Dog (2) 
     Doberman (3) 
     Rottweiler (3) 
    Cat (2) 
     Siamese (3) 
     Persian (3) 

如果你不熟悉的实体组件系统,让我们说,如果我想要一个名为“雷克斯”杜宾犬,我会做这样的事情:

let Rex: Entity = createEntity("Doberman"); 

的杜宾犬组件延伸到狗,狗延伸到动物。因此,雷克斯接收所有这三个组件的属性。

现在,当我想选择具有Animal组件的所有实体(即“selectEntities(Animal)”)时,我也想选择Dogs,Cats,Dobermans等。换句话说:所有继承的组件。这就是我被卡住的地方,因为它必须是动态的,并考虑到任何继承组件的链,无论它有多少层。在我的第一个版本中,组件只能被其他组件继承,这使得简单的循环成为浏览所有实体的简单解决方案。

现在,一个特定的组件仍然可以扩展到只有一个其他组件(Dog to Animal),但它可以通过无限数量的组件(来自Doberman和Rottweiler的Dog)进行扩展。而我无法弄清楚如何从父级获取所有组件。只有循环的重叠/联锁才可行吗?

谢谢。

回答

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; 
} 

而且天的教训是:“不要在黄昏打一个逻辑问题,让夜间通行证”。 :)