Swift 多次注册 SpriteKit 碰撞

Swift SpriteKit Collisions Registered Multiple Times

我正在使用 SpriteKit 和 Swift 构建一个 iPhone 游戏,但我的碰撞检测系统无法正常运行。当我的 "bullet" 物理 body 和我的 "player" 物理 body 发生碰撞时,碰撞检测函数被调用多次,通常是 4-12 次。我试过将 "usesPreciseCollisionDetection" 设置为 true,但它仍然存在问题。此外,当子弹以一定角度而不是直接击中玩家时,该方法似乎被调用了更多次。有什么想法可以解决这个问题吗?

碰撞类型:

enum ColliderType:UInt32 {
    case Player = 0b1
    case Bullet = 0b10
}

玩家物理Body设置:

playerBody!.categoryBitMask = ColliderType.Player.rawValue
playerBody!.contactTestBitMask = ColliderType.Bullet.rawValue
playerBody!.collisionBitMask = ColliderType.Bullet.rawValue

子弹物理Body设置:

bulletBody!.categoryBitMask = ColliderType.Bullet.rawValue
bulletBody!.contactTestBitMask = ColliderType.Player.rawValue
bulletBody!.collisionBitMask = ColliderType.Player.rawValue

碰撞检测方法:

func didBeginContact(contact: SKPhysicsContact) {

    if (contact.bodyA.categoryBitMask == 0b1) && (contact.bodyB.categoryBitMask == 0b10) {
        playerVbullet(contact.bodyA, bullet: contact.bodyB)
    }

    if (contact.bodyA.categoryBitMask == 0b10) && (contact.bodyB.categoryBitMask == 0b11) {
        playerVbullet(contact.bodyB, bullet: contact.bodyA)
    }
}

碰撞时调用的函数:

func playerVbullet(player:SKPhysicsBody, bullet:SKPhysicsBody) {
    bullet.node?.removeFromParent()
    collisions++
    println(collisions)
}

为项目符号节点命名:

let bullet = SKSPriteNode()
bullet.name = "bullet"

然后检查你的物理接触

if (contact.bodyA.node?.name == "bullet") {
    contact.bodyA.node?.removeFromParent()
} else if contact.bodyB.node?.name == "bullet" {
    contact.bodyB.node?.removeFromParent()
}

祝你好运!