Phaser 3:启用睡眠事件后静态方块异常问题求助
解决方案
核心思路是初始时关闭方块的重力而非设置为静态,这样既避免方块自动下落,又能保证它处于动态状态(不会直接进入睡眠),点击后再恢复重力让其下落,同时正常监听睡眠事件。
修改关键代码:
- 调整方块初始化逻辑:
const startRound = () => { background.setInteractive(); block = this.matter.add.image(300, blockPositionTop, 'block') .setOrigin(.5, .5) .setBounce(0) .setMass(10) .setGravity(0, 0); // 关闭重力,替代setStatic(true) block.setSleepEvents(true, true); }
- 更新
enableGravity函数,恢复重力:
const enableGravity = () => { background.disableInteractive(); block.setGravity(0, 1); // 恢复y轴重力,让方块下落 }
为什么这样有效:
- 静态物体(
setStatic(true))在Matter.js中会被标记为睡眠状态,因为它们不需要物理模拟,所以无法通过setStatic(false)唤醒后正常下落。 - 关闭重力的动态物体,既不会受重力影响自动下落,又保持动态属性,只有当它因碰撞或外力静止一段时间后才会进入睡眠,完美匹配需求:点击前静止,点击后下落,下落静止后触发睡眠事件开启下一轮。
可选优化(如果睡眠触发不灵敏):
可以调整Matter的睡眠参数,设置方块的睡眠阈值,确保静止后快速触发事件:
block.setSleepThreshold(0.01); // 降低睡眠触发的阈值,让静止更快触发睡眠
内容的提问来源于stack exchange,提问作者Wiz
相关产品推荐
相关产品推荐

