Phaser 3中对象重叠未触发事件,cutcoin回调函数无法调用问题
Phaser 3 重叠检测未触发问题修复方案
核心问题点
- 玩家对象
moveCoin未启用物理引擎:使用this.add.sprite()创建的是普通显示对象,不携带Arcade物理体,Phaser物理重叠检测仅对带物理体的对象生效。 - 重叠检测注册时机错误:重叠检测的注册逻辑放在了按键A的1秒延迟回调中,只有按下A键1秒后才会生成检测规则,未按A时重叠检测完全不生效,且重复按A会重复注册同一逻辑,造成性能冗余。
- 回调参数认知偏差:重叠回调的第二个参数为触发重叠的单枚金币实例,而非整个金币组对象。
修复后代码
function create() { var healthGroup = this.physics.add.staticGroup({ key: 'ycoin', frameQuantity: 10, immovable: true }); var children = healthGroup.getChildren(); for (var i = 0; i < children.length; i++) { var x = Phaser.Math.Between(50, 750); var y = Phaser.Math.Between(50, 550); children[i].setPosition(x, y); } healthGroup.refresh(); // 创建带物理体的玩家对象 moveCoin = this.physics.add.sprite(60, 340, "ycoin").setInteractive(); // 提前注册全局重叠检测,不需要放在按键回调里 this.physics.add.overlap(moveCoin, healthGroup, cutcoin, null, this); this.input.keyboard.on('keydown-A', () => { moveCoin.allname = "green" diceNumber = 1 moveCoinStep() }) } // 回调第二个参数为单枚金币实例 function cutcoin(movecoin1, coin) { console.log('++++++', movecoin1, coin) // 实现金币消失逻辑 coin.destroy() }
额外注意事项
请确保场景配置中已开启Arcade物理引擎,示例配置参考:
const config = { type: Phaser.AUTO, physics: { default: 'arcade', arcade: { debug: false // 调试时可开启debug查看物理体碰撞区域 } }, scene: { create: create } }
若调试时发现碰撞区域和显示对象不匹配,可手动调用setSize()调整物理体尺寸。
内容的提问来源于stack exchange,提问作者Nitesh jha
相关产品推荐
相关产品推荐

