【问题标题】:How to browse an inheritance system?如何浏览继承系统?
【发布时间】:2017-05-04 16:01:53
【问题描述】:

我正在制作一个实体/组件系统,但在制作一个可以根据继承的组件选择实体的函数时遇到了一些问题。举个例子:

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

如果你不熟悉实体组件系统,假设我想要一只名为“Rex”的杜宾犬,我会这样做:

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

Doberman 组件延伸到 Dog,而 Dog 延伸到 Animal。所以 Rex 接收到所有这三个组件的属性。

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

现在,一个特定的组件仍然可以仅扩展到另一个组件(Dog 到 Animal),但它可以扩展到无限数量的组件(Doberman 和 Rottweiler 的 Dog)。而且我不知道如何从父级获取所有组件。仅通过重叠/联锁循环是否可行?

谢谢。

【问题讨论】:

    标签: javascript inheritance components entity


    【解决方案1】:

    我误解了原来的问题。问题应该是“如何迭代嵌套对象?”,这有一个简单的解决方案:递归调用。

    所以我们可以这样做:

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

    白天的教训是:“不要在黄昏时解决逻辑问题,让夜晚过去。” :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-30
      相关资源
      最近更新 更多