【问题标题】:Swift Spritekit Collision HandlingSwift Spritekit 碰撞处理
【发布时间】:2016-04-13 01:42:30
【问题描述】:

这是我第一次尝试使用 SpriteKit,但我无法正确使用位掩码进行碰撞。 我有三个类别,如果玩家点击 lit,我想增加分数并将 lit 节点移出屏幕,否则,我想调用我的 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 条件等于 0 和 1,而是希望它们等于您正在检查的类别
  • id didBeginContact 是否调用过?

标签: swift sprite-kit collision


【解决方案1】:

if ((firstBody.categoryBitMask &amp; playerCategory) == 0 &amp;&amp; (secondBody.categoryBitMask &amp; litCategory) == 1) 翻译成英文。

如果 Firstbody AND playerCategory = 0 AND SecondBody And litCategory = 1

如果 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 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()
    }

}

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多