亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何更改對象的碰撞過濾器,使其不再與 MouseConstraint (MatterJS) 交互

如何更改對象的碰撞過濾器,使其不再與 MouseConstraint (MatterJS) 交互

守著一只汪 2023-07-29 11:11:21
我正在制作Slingshot演示。問題是,在發射巖石后,仍然可以單擊并拖動它,我想禁用它。我在巖石上添加了一個過濾器:var rockOptions = {? density: 0.004,? restitution: 0.75,? collisionFilter: { mask: SOLID, category: NEXTBALL }};以及鼠標約束:var mouse = Mouse.create(render.canvas),? mouseConstraint = MouseConstraint.create(engine, {? ? mouse: mouse,? ? collisionFilter: { category: NEXTBALL },? ? constraint: {? ? ? stiffness: 0.2,? ? ? render: {? ? ? ? visible: true? ? ? }? ? }? });然后在單擊事件中我嘗試更改該過濾器,因此它不應再與鼠標類別匹配:Events.on(engine, "afterUpdate", function () {? if (? ? mouseConstraint.mouse.button === -1 &&? ? (rock.position.x > shootPosition.x + 20 ||? ? ? rock.position.y < shootPosition.y - 20)? ) {? ? Composite.remove(engine.world, elastic);? ? rock.collisionFilter = {category: SOLID, mask: SOLID};? }});但它仍然是可拖動的。我猜問題是我如何更改巖石上的過濾器,但我在文檔中沒有看到任何建議更改它的方法。我不認為這是因為我設置的類別,但在這里它們只是為了以防萬一(實體和圖像的確實有效,球不會與圖像的碰撞:const SOLID = 0x0001;const IMAGE = 0x0002;const NEXTBALL = 0x0003;幫我讓巖石不再可點擊
查看完整描述

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 交互。

查看完整回答
反對 回復 2023-07-29
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

經過多次重新開始、調整和檢查不同的演示后,終于弄清楚了。

首先,類別的位掩碼必須是 2 的冪,因此NEXTBALL必須是0x0004而不是0x0003。

接下來,您不能將整個collisionFilter對象設置在已建立的實體上,否則會破壞碰撞。相反,你必須使用rock.collisionFilter.category = NEXTBALL;


查看完整回答
反對 回復 2023-07-29
  • 2 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號