未检测到SpriteKit碰撞

时间:2017-10-04 01:13:29

标签: swift sprite-kit skphysicsbody

我有两个节点,一个“猫”和一个“老鼠”,但由于某种原因,我无法检测到他们的碰撞。我正在使用这种方法制作面具:

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并使它们像“成分”一样变得不同,那么我可以看到猫和老鼠正在与成分相互作用,但似乎它们不会互相交互。

1 个答案:

答案 0 :(得分:1)

ratscats不会互相触发联系,因为isDynamic都设置为false。在触发联系之前,其中至少有一个需要是动态的。

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

  

isDynamic属性控制是否为基于卷的正文   受重力,摩擦,与其他物体碰撞的影响,以及您直接应用于物体的力或冲动。