Matter.js 碰撞过滤器选项消失又重新出现?

我正在构建一个简单的模拟,我需要超过 32 个类别,因此我实现了建议的解决方案来定义一个Detector.canCollide函数来允许我这样做。


Detector.canCollide = function (filterA, filterB) {

    console.log(filterB)

    return (filterB["collidesWith"].includes(filterA["group"]) || filterB["group"] == 0) 

        && (filterA["collidesWith"].includes(filterB["group"]) || filterA["group"] == 0);

}  

上面给出了错误:filterB["collidesWith"]未定义。经过进一步检查,我使用了一个console.log()语句来找出这个对象(filterB)发生了什么,它返回了这个:


{category: 1, mask: 4294967295, group: 3, collidesWith: Array(1)}

category: 1

collidesWith: [0]

group: 3

mask: 4294967295

__proto__: Object}


{category: 1, mask: 4294967295, group: 1}

category: 1

group: 1

mask: 4294967295

__proto__: Object}

第二个对象似乎是该console.log()功能的延续(因为它在打印后继续记录)


编辑: 我发现这filterA是相反的,首先它打印:


{category: 1, mask: 4294967295, group: 1}

category: 1

group: 1

mask: 4294967295

__proto__: Object}


{category: 1, mask: 4294967295, group: 2, collidesWith: Array(1)}

category: 1

collidesWith: [0]

group: 2

mask: 4294967295

__proto__: Object}

filterA注意:当我初始化碰撞体时,碰撞过滤器选项与分别出现 ( ) 和消失 ( filterB)的值相同


我的代码其他地方有错误吗?或者这是我忽略的其他 Matter.js 功能?


阿晨1998
浏览 106回答 1
1回答

ibeautiful

很抱歉没有早点更新这个线程,虽然我还没有发现这个错误,但我意识到这对于我的特定模拟来说不是最好的方法,而是创建了一个更好的系统,而无需检查这些未定义的变量。相反,我创建了一个名为 Layer 的碰撞过滤器,并将每个代理分配到不同的层,可以与 上的所有内容发生碰撞的事物layer: 0,与 上的任何事物都不会发生碰撞的事物layer: -1,并使用以下代码来实现此目的。我将这个collisionFilter.layer属性赋予了模拟中的每个对象。Detector.canCollide = function (filterA, filterB) {    if (filterA.layer != -1 && filterB.layer != -1){        return (filterA.layer == filterB.layer || (filterA.layer == 0 || filterB.layer==0));    } else {        return false;    }}  
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript