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
;
添加回答
舉報