SKPhysics 无法正常工作?

SKPhysics not working properly?

struct PhysicsCategory {
    static let None      : UInt32 = 0
    static let All       : UInt32 = UInt32.max
    static let planet    : UInt32 = 0b1    
    static let rocket    : UInt32 = 0b10 }

planet.physicsBody = SKPhysicsBody(circleOfRadius: planet.size.width / 2)
planet.physicsBody?.dynamic = true planet.physicsBody?.categoryBitMask = PhysicsCategory.planet
planet.physicsBody?.contactTestBitMask = PhysicsCategory.rocket 
planet.physicsBody?.collisionBitMask = PhysicsCategory.None

func planetCollidedWithRocket(rocket: SKSpriteNode, planet: SKSpriteNode) {
    println("collision planet") }



 func didBeginContact(contact: SKPhysicsContact) {
        var firstBody: SKPhysicsBody
        var secondBody: SKPhysicsBody
        if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
        } else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA }

        if ((firstBody.categoryBitMask & PhysicsCategory.planet != 0) &&
            (secondBody.categoryBitMask & PhysicsCategory.rocket != 0)) {
            planetCollidedWithRocket(firstBody.node as! SKSpriteNode, planet: secondBody.node as! SKSpriteNode)}

我目前正在使用它为我的游戏添加碰撞检测(我只删除了我认为相关的代码位)。我第一次 运行 在模拟器上玩游戏时它运行良好,我在 planetCollidedWithRocket 方法中添加了一个游戏结束场景。但我今天再次测试了它,出于某种原因,游戏在火箭和行星没有碰撞时检测到它们之间的碰撞!谁能看出我做错了什么??

您的联系人设置不正确。这就是您所拥有的,以及它的含义:

if((firstBody.categoryBitMask & PhysicsCategory.planet !=0)
// This is checking if the firstBody *has* a categoryBitMask, but it is not evaluating what it is. 
// In addition to that, it is requiring that the PhysicsCategory.planet does not equal zero, which it doesn't. 
// This would evaluate to true every time, no matter what.
// It is also requiring that...


&& (secondBody.categoryBitMask & PhysicsCategory.rocket != 0))
// This is checking if the secondBody *has* a categoryBitMask, but it is not evaluating what it is.
// In addition to that, it is requiring that the PhysicsCategory.planet does not equal zero, which it doesn't.
// This would evaluate to true every time, no matter what.

您需要做的是检查您的 categoryBitMask 等于 PhysicsCategory 变量之一,这样当行星和火箭接触时,某些东西的计算结果为真。试试这个:

if ((firstBody.categoryBitMask == PhysicsCategory.planet) &&
    (secondBody.categoryBitMask == PhysicsCategory.rocket)){

// Code Here

}

或者,由于您知道 PhysicsCategory 结构中的硬编码数字,您可以计算硬数字:

if ((firstBody.categoryBitMask == 1) &&
    (secondBody.categoryBitMask == 2)){

// Code Here

}

这样做的目的是检查 physicsBody 的 categoryBitMask 在接触时是否等于特定数字。如果他们这样做,就会发生一些事情,否则,什么也不会发生。