Matter.js 碰撞过滤器选项消失又重新出现?
Matter.js Collision Filter Options Disappear and Reappear?
我正在构建一个简单的模拟,
我需要的不仅仅是 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 功能?
抱歉没有早点更新这个帖子,
虽然我还没有发现错误,
我意识到这不是我的特定模拟的最佳方法,而是创建了一个更好的系统而无需检查这些未定义的变量。
相反,我创建了一个名为 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;
}
}
我正在构建一个简单的模拟,
我需要的不仅仅是 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 功能?
抱歉没有早点更新这个帖子,
虽然我还没有发现错误,
我意识到这不是我的特定模拟的最佳方法,而是创建了一个更好的系统而无需检查这些未定义的变量。
相反,我创建了一个名为 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;
}
}