如何让精灵响应接触事件而不是碰撞事件(SpriteKit)?

How to make sprites respond to contact events but not collision events (SpriteKit)?

是否可以让 Swift 中的精灵只响应接触事件,忽略碰撞事件?我们将其中一个 sprite 的 dynamic 属性 设置为 false,但是当另一个 sprite 接触它时它没有触发 didBeginContact 方法。

换句话说,我们希望在另一个 sprite 接触到一个对象时在 didBeginContact 中收到通知,但我们不希望该 sprite 经历物理(例如,碰撞时不弹跳或移动)。

将两个精灵的 collisionbitmask 设置为 0。但是将 contacttestbitmask 设置为相反的 sprites categorybitmask

举个例子

这是我的 Power Up 的设置,这是一个没有表现出物理行为的物理体

    self.physicsBody = SKPhysicsBody(rectangleOfSize: self.size)
    self.physicsBody!.categoryBitMask = CategoryPowerup
    self.physicsBody!.contactTestBitMask = CategoryShip
    self.physicsBody!.collisionBitMask = 0
    self.physicsBody!.dynamic = false

这是我的 Ship 的设置,它获得了 powerup

    let physicsBodyInset = CGRectInset(CGRectMake(0, 0, self.size.width, self.size.height), 2, 2)
    self.physicsBody = SKPhysicsBody(rectangleOfSize: physicsBodyInset.size)
    self.physicsBody!.restitution = 0
    self.physicsBody!.categoryBitMask = CategoryShip