Swift Spritekit 碰撞处理
Swift Spritekit Collision Handling
这是我第一次尝试使用 SpriteKit,但我无法正确处理位掩码的碰撞。
我有三个类别,如果玩家点亮,我想增加分数并将点亮的节点移出屏幕,否则,我想调用我的 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()
}
}
if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)
翻译成英文如下。
If Firstbody AND playerCategory = 0 AND SecondBody And litCategory = 1
If Firstbody AND 1 = 0 AND SecondBody And 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 和 litCategory)只能有 0 或 4 的值,那么这 2 个值将永远不会1.
要更正此问题,您需要确保您正在检查的 body 与您正在查找的类别相同
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()
}
}
这是我第一次尝试使用 SpriteKit,但我无法正确处理位掩码的碰撞。 我有三个类别,如果玩家点亮,我想增加分数并将点亮的节点移出屏幕,否则,我想调用我的 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()
}
}
if ((firstBody.categoryBitMask & playerCategory) == 0 && (secondBody.categoryBitMask & litCategory) == 1)
翻译成英文如下。
If Firstbody AND playerCategory = 0 AND SecondBody And litCategory = 1
If Firstbody AND 1 = 0 AND SecondBody And 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 和 litCategory)只能有 0 或 4 的值,那么这 2 个值将永远不会1.
要更正此问题,您需要确保您正在检查的 body 与您正在查找的类别相同
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()
}
}