2017-06-06 88 views
0

我正在用GameObjects構建遊戲。在我的遊戲中,我將GameObjects從CollidableObject中分離出來。所有對象(GameObjects和CollidableGameObjects)都被推送到一個名爲gameObjects的單個數組中。將數組和陣列過濾爲不同類型的陣列

當涉及到碰撞檢測我想過濾gameObjects數組,所以我只能循環CollidableObject類型的對象。我創建了這個下面的代碼:

let temp : any = this.gameObjects.filter(g => g instanceof CollidableObject); 

//optional 
let collidables : Array<CollidableObject> = temp; 

for (let obj1 of collidables) { 
    for (let obj2 of collidables){ 
     if (obj1 != obj2) { 
      if(obj1.hasCollision(obj2)) {   
       obj1.onCollision(obj2); 
       this.gameOver(); 
      } 
     } 
    } 
} 

問題1:爲什麼不能直接過濾到CollidableObject的陣列?

問題2:有沒有一種更簡單的方法來過濾某種類型的數組?

+0

對於你的第一個問題[這個問題](https://github.com/Microsoft/TypeScript/issues/7657)可能是相關的。 – Saravana

回答

1

你可以這樣做:

let temp = this.gameObjects.filter(g => g instanceof CollidableObject) as CollidableObject[]; 

或簽名添加到陣列接口:

interface Array<T> { 
    filter<S>(callbackfn: (this: void, value: T, index: number, array: T[]) => boolean): S[]; 
} 

然後:

let temp = this.gameObjects.filter<CollidableObject>(g => g instanceof CollidableObject); 

如果你使用一個模塊系統(即你正在導入/導出),那麼你需要增加全局模塊:

declare global { 
    interface Array<T> { 
     filter<S>(callbackfn: (this: void, value: T, index: number, array: T[]) => boolean): S[]; 
    } 
}