You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phaser 3 Matter Physics如何检测两个物理对象的碰撞?

解决Phaser Matter.js中物理对象的碰撞检测问题

Got it, let's walk through how to add collision detection between your player and pillar in Phaser's Matter.js physics system—here are two straightforward, effective approaches based on your existing code:

方法1:全局碰撞事件监听

你可以给Matter物理世界绑定一个collisionstart事件,每次有两个物体开始碰撞时都会触发,然后在回调里精准判断是不是你要检测的两个对象:

export class MainGame extends Scene { 
  public create() { 
    // Create the player
    this.player = this.matter.add.image(300, 100, 'player')
    // 给player加个自定义属性,方便后续识别碰撞对象
    this.player.setData('type', 'player')

    // Create a pillar
    let pillar = this.matter.add.image(500, 0, 'pillar1', null, { isStatic: true })
    pillar.setData('type', 'pillar')

    // 监听碰撞开始事件
    this.matter.world.on('collisionstart', (event, bodyA, bodyB) => {
      // 判断碰撞的两个物体是否为player和pillar
      const isTargetCollision = (
        (bodyA.gameObject.getData('type') === 'player' && bodyB.gameObject.getData('type') === 'pillar') ||
        (bodyA.gameObject.getData('type') === 'pillar' && bodyB.gameObject.getData('type') === 'player')
      )

      if (isTargetCollision) {
        console.log('Player collided with pillar!')
        // 这里写碰撞后的逻辑,比如扣血、播放碰撞动画等
      }
    })
  } 
}

给对象加自定义type属性的好处是,当场景里有多个同类型物体(比如多个pillar)时,依然能准确识别碰撞,不用挨个对比对象引用。

方法2:给单个对象绑定碰撞回调

如果你只关心player和其他物体的碰撞,直接给player绑定专属的碰撞回调会更简洁,不用全局监听所有碰撞事件:

export class MainGame extends Scene { 
  public create() { 
    // Create the player
    this.player = this.matter.add.image(300, 100, 'player')
    // 给player绑定碰撞开始的回调函数
    this.player.setOnCollideStart((event) => {
      const otherObject = event.bodyB.gameObject
      // 通过纹理key判断碰撞的是不是pillar
      if (otherObject.texture.key === 'pillar1') {
        console.log('Player hit the pillar!')
        // 执行你需要的碰撞后操作
      }
    })

    // Create a pillar
    let pillar = this.matter.add.image(500, 0, 'pillar1', null, { isStatic: true })
  } 
}

这个方法更聚焦,只处理和player相关的碰撞。除了用纹理key判断,你也可以沿用方法1的自定义属性,或者直接对比对象引用(比如otherObject === pillar),看哪种更适合你的场景。

小补充

  • 除了collisionstart,还有collisionactive(碰撞持续过程中触发)和collisionend(碰撞结束时触发)事件,按需选择即可。
  • 保持pillar的isStatic: true设置是对的,这样静态物体不会被player撞动,符合场景逻辑。

内容的提问来源于stack exchange,提问作者Get Off My Lawn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:01:10