2017-06-06 12 views
0

私はGameObjectsでゲームを構築しています。私のゲームでは、GameObjectをCollidableObjectから分離しました。すべてのオブジェクト(GameObjectsおよびCollidableGameObjects)は、gameObjectsという1つの配列にプッシュされます。フィルター配列と異なる配列のキャスト配列

衝突検出に関しては、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:特定のタイプのアレイを簡単にフィルタリングする方法はありますか?あなたはモジュールシステムを使用している場合

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

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

をORアレイインターフェイスに署名を追加します:

+0

あなたの最初の質問[この問題](https://github.com/Microsoft/TypeScript/issues/7657)は関連性があります。 – Saravana

答えて

1

あなたはこれを行うことができ、その後

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

そして、 (つまり、インポート/エクスポートしている)場合は、グローバルモジュールを補強する必要があります。

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