这是我第一次尝试使用SpriteKit而我遇到了使用bitmasks进行碰撞时遇到的问题。 我有三个类别,如果玩家点亮,我想增加分数并将点亮的节点移出屏幕,否则,我想调用我的gameover()函数。我已经尝试了很多变化,并且看不到任何东西,只能识别一般碰撞。我也为每个节点定义了类别和联系位掩码。
let playerCategory: UInt32 = 1
let razzCategory: UInt32 = 2
let litCategory: UInt32 = 4
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 & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)
{
lit.position.x = 400
score += 1
}
else {
gameOver()
}
}
答案 0 :(得分:0)
if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)
用英语翻译成以下内容。
如果Firstbody AND playerCategory = 0 AND SecondBody且litCategory = 1
如果Firstbody AND 1 = 0 AND SecondBody且4 = 1
现在让我们将Firstbody定义为playerCategory,将SecondBody定义为litCategory
如果playerCategory AND playerCategory = 0 AND litCategory和litCategory = 1
如果1 AND 1 = 0 AND 4 AND 4 = 1
如果1 = 0且4 = 1
正如您所看到的,这失败了,并且此方法总是会失败,因为如果测试的后半部分(SecondBody AND litCategory)只能具有0或4的值,那么这2个值将永远不会为1。
要纠正此问题,您需要确保您检查的任何正文与您要查找的类别相同
if ((firstBody.categoryBitMask & playerCategory) == playerCategory && (secondBody.categoryBitMask & litCategory) == litCategory)
这就是说,如果firstBody是类别playerCategory的成员而secondBody是litCategory的成员,那么执行以下操作。
以下是您的功能的完整修复:
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 & playerCategory) == playerCategory && (secondBody.categoryBitMask & litCategory) == litCategory)
{
lit.position.x = 400
score += 1
}
else {
gameOver()
}
}