1

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

我有这个:

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

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

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()
    }
}
4

3 回答 3

1

首先,您应该将 firstBody 和 secondBody 设置为它们的碰撞位掩码的顺序:

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
于 2014-10-09T18:45:33.367 回答
1

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

于 2015-01-23T15:15:45.717 回答
0

尝试:

secondBody = contact.bodyB
于 2014-10-09T18:39:33.670 回答