我正在使用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 :(得分:2)
你可以这样做:
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[];
}
}