SKPhysicsContact有什么方法可以确定哪个体是A和B?

Siu*_*han 4 objective-c game-physics sprite-kit swift

在SpriteKit中,我们检测了didBeginContact方法.但是做这样的事情看起来有点愚蠢:func didBeginContact(contact:SKPhysicsContact){

    if let contactA = contact.bodyA.node?.name {

        if let contactB = contact.bodyB.node?.name {

            //now that we have safely unwrapped these nodes, we can operate on them

            if contactA == "ball" {

                collisionBetweenBall(contact.bodyA.node!, object: contact.bodyB.node!)

            } else if contactB == "ball" {

                collisionBetweenBall(contact.bodyB.node!, object: contact.bodyA.node!)

            }

        }

    }

}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以确保bodyA永远是一个球吗?有没有与categorybitmask相关的规则?

Ste*_*ves 5

如果您使用的是简单类别,每个物理主体只属于一个类别,则didBeginContact的这种替代形式可能更具可读性:

func didBeginContact(contact: SKPhysicsContact) {
    let contactMask = contact.bodyA.categoryBitMask | contact.bodyB.categoryBitMask

switch contactMask {

   case categoryBitMask.ball | categoryBitMask.something:
       print("Collision between ball and something")
       let ballNode = contact.bodyA.categoryBitMask == categoryBitMask.ball ? contact.bodyA.node! : contact.bodyB.node!
       ballNode.pop()
       score += 10

   default :
       //Some other contact has occurred
       print("Some other contact")
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您的类别更复杂,这将不起作用,因为简单的AND tests(categoryBitMask.ball | categoryBitMask.something)将不匹配.