初学者swift sprite kit - 节点碰撞检测帮助(SKPhysicsContact)

时间:2014-10-09 04:45:30

标签: swift sprite-kit sprite collision skphysicscontact

我希望精灵在触摸另一个精灵时自行删除。现在,当他们触摸时,他们只是相互推动。

我有这个:

let alphaCategory: UInt32 = 0x1 << 0
let betaCategory: UInt32 = 0x1 << 1

我使精灵充满活力而不受重力的影响

self.physicsworld.contactDelegate = self

alpha.physicsBody?.categoryBitMask = alphaCategory
alpha.physicsBody?.contactTestBitmask = betaCategory

beta.physicsBody?.categoryBitMask = betaCategory
beta.physicsBody?.contactTestBitmask = alphaCategory

我在swift中找不到任何对我有意义的东西,但我认为问题就在这里

func didBeginContact(contact: SKPhysicsContact) {

    var firstBody: SKPhysicsBody
    var secondBody: SKPhysicsBody

    if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask {
        firstBody = contact.bodyA
        secondBody = contact.BodyB
        beta.removeFromParent()
    }
}

3 个答案:

答案 0 :(得分:1)

首先你要设置你的firstBody&amp; secondBody到他们的collisionBitMask的顺序:

if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask 
    {
        firstBody = contact.bodyA
        secondBody = contact.bodyB
    }
else {
        firstBody = contact.bodyB
        secondBody = contact.bodyA
     }

if firstBody.categoryBitMask=0 && secondBody.categoryBitMask=1 {
      secondBody.removeFromParent()
}

这可以防止你的精灵与任何东西(包括彼此)发生碰撞。将其设置为设置其他BitMask属性的位置:

alpha.physicsBody.collisionBitMask = 0
beta.physicsBody.collisionBitMask = 0

答案 1 :(得分:1)

这实际上会引起问题,因为我去年夏天在SpritKit游戏中发现了这个问题。如果在任何SKPhysicsContact回调期间修改场景的节点结构,则根据Apple未定义结果。在对此提交错误后我被告知的是,您永远不应该从任何这些回调中修改场景节点结构。相反,Apple说只需设置一个标志,然后在更新循环中处理场景修改,这是安全的。

答案 2 :(得分:0)

尝试:

secondBody = contact.bodyB