未检测到 SpriteKit 碰撞

SpriteKit collision not being detected

我有两个节点,一个 "cat" 和一个 "rat",但由于某种原因我无法检测到它们的碰撞。我正在使用这种方法制作面具:

enum CollisionTypes: UInt32 {
    case holder      = 1
    case chef        = 2
    case powerups    = 4
    case ingredients = 8
    case utensils    = 16
    case floor       = 32
    case bag         = 64
    case table       = 128
    case tip         = 256
    case rat         = 512
    case cat         = 1024
    }

这里是我初始化物理体的地方:

    // Cat physics body, the node's name is "cat"       
     public func initializeAt(position: CGPoint) {

    sprite.position = position
    sprite.zPosition = 5
    sprite.name = "cat"
    sprite.alpha = 0.7
    scene.sceneContent.addChild(sprite)

    sprite.physicsBody = SKPhysicsBody(rectangleOf: sprite.size)
    sprite.physicsBody!.isDynamic = false
    sprite.physicsBody!.categoryBitMask    = CollisionTypes.cat.rawValue
    sprite.physicsBody!.contactTestBitMask = CollisionTypes.rat.rawValue
    sprite.physicsBody!.collisionBitMask   = CollisionTypes.rat.rawValue


    // Rat physics body, the nodes name is "rat"
    init() {
    node.name = "rat"
    node.zPosition = 5

    node.physicsBody = SKPhysicsBody(rectangleOf: node.size)
    node.physicsBody!.isDynamic = false
    node.physicsBody!.categoryBitMask = CollisionTypes.rat.rawValue
    node.physicsBody!.contactTestBitMask = CollisionTypes.cat.rawValue
    node.physicsBody!.collisionBitMask = CollisionTypes.cat.rawValue

    setupFrames()
    }

这是我的 didBegin() 方法。但是,这两个 if 语句都没有执行,我不知道为什么,因为我在我的项目中将此方法用于许多其他事情。

func didBegin(_ contact: SKPhysicsContact) {
    if let node1 = contact.bodyA.node as? SKSpriteNode,
        let node2 = contact.bodyB.node as? SKSpriteNode {

        if node1.name == "rat" && node2.name == "cat" {

            for rat in rats {
                if node1 == rat.node {
                    rat.die()
                }
            }

            Cat.shared.resetPosition()
            return
        }
        else if node1.name == "cat" && node2.name == "rat" {

            for rat in rats {
                if node2 == rat.node {
                    rat.die()
                }
            }

            Cat.shared.resetPosition()
            return
        }

如果我尝试使用 contactTestBitMasks 并使它们变得不同,例如 "ingredients",那么我可以看到猫和老鼠正在与成分相互作用,但它们似乎只是不会彼此相互作用。

ratscats 不会触发彼此的联系,因为两者都将 isDynamic 设置为 false。在触发联系之前,至少其中之一需要是动态的。

来自https://developer.apple.com/documentation/spritekit/skphysicsbody

The isDynamic property controls whether a volume-based body is affected by gravity, friction, collisions with other objects, and forces or impulses you directly apply to the object.