2017-05-04 53 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; 
} 

而且天的教訓是:「不要在黃昏打一個邏輯問題,讓夜間通行證」。 :)