2 回答

TA贡献1852条经验 获得超1个赞
防止鼠标操纵已经射击的岩石可以通过 // <---
下面代码片段中所示的两个简单更改来实现。
rock.collisionFilter.category = 0b10;
将刚刚发射的任何岩石的类别设置为 2,然后创建新的岩石并rock
用要发射的下一块岩石覆盖变量。collisionFilter: {mask: 0b1},
将鼠标约束上的遮罩设置为仅与类别 1 中的实体交互。由于禁用的岩石属于类别 2 (0b10
),因此鼠标将不再与它们交互。
这是上下文中的代码。我使用这个提交以防万一发生任何变化。
Events.on(engine, 'afterUpdate', function() {
if (mouseConstraint.mouse.button === -1 && (rock.position.x > 190 || rock.position.y < 430)) {
rock.collisionFilter.category = 0b10; // <---
rock = Bodies.polygon(170, 450, 7, 20, rockOptions);
Composite.add(engine.world, rock);
elastic.bodyB = rock;
}
});
// add mouse control
var mouse = Mouse.create(render.canvas),
mouseConstraint = MouseConstraint.create(engine, {
mouse: mouse,
collisionFilter: {mask: 0b1}, // <---
constraint: {
stiffness: 0.2,
render: {
visible: false
}
}
});
默认mask
值为 32 位全部设置,或4294967295
/ 0xffffffff
。您可能希望更精确,并仅禁用鼠标约束的第二位:0xfffffffd
。这使得鼠标可以与除类别 2 之外的任何对象交互,而不仅仅是与类别 1 交互。

TA贡献1995条经验 获得超2个赞
经过多次重新开始、调整和检查不同的演示后,终于弄清楚了。
首先,类别的位掩码必须是 2 的幂,因此NEXTBALL
必须是0x0004
而不是0x0003
。
接下来,您不能将整个collisionFilter
对象设置在已建立的实体上,否则会破坏碰撞。相反,你必须使用rock.collisionFilter.category = NEXTBALL
;
添加回答
举报