ios - 碰撞检测中断另一个碰撞检测 - Swift

标签 ios xcode swift collision-detection collision

到目前为止,我有一个 SKSpriteNode,它可以检测与我的球的碰撞,并在碰撞时将我的分数增加 + 1。碰撞中还有检测我的球是否撞到墙壁的代码。

    let scoreNode = SKSpriteNode()

    scoreNode.size = CGSize(width: 750, height: 10)
    scoreNode.position = CGPoint(x: self.frame.width / 2, y: self.frame.height / 2 + 100)
    scoreNode.physicsBody = SKPhysicsBody(rectangleOfSize: scoreNode.size)
    scoreNode.physicsBody?.affectedByGravity = false
    scoreNode.physicsBody?.dynamic = true
    scoreNode.physicsBody?.categoryBitMask = PhysicsCat.Score
    scoreNode.physicsBody?.collisionBitMask = 0
    scoreNode.physicsBody?.contactTestBitMask = PhysicsCat.Ball
    scoreNode.color = SKColor.clearColor()

func didBeginContact(contact: SKPhysicsContact) {


    let firstBody = contact.bodyA
    let secondBody = contact.bodyB



    if firstBody.categoryBitMask == PhysicsCat.Score && secondBody.categoryBitMask == PhysicsCat.Ball{

        score += 1
        scoreLbl.text = "\(score)"
        firstBody.node?.removeFromParent()


    }

    else if firstBody.categoryBitMask == PhysicsCat.Ball && secondBody.categoryBitMask == PhysicsCat.Score {

        score += 1
        scoreLbl.text = "\(score)"
        secondBody.node?.removeFromParent()


    }
    else if firstBody.categoryBitMask == PhysicsCat.Ball && secondBody.categoryBitMask == PhysicsCat.Wall || firstBody.categoryBitMask == PhysicsCat.Wall && secondBody.categoryBitMask == PhysicsCat.Ball{

        enumerateChildNodesWithName("wallPair", usingBlock: ({
            (node, error) in

            node.speed = 0
            self.removeAllActions()

        }))

        if died == false{
            died = true
            createBTN()
            fallDie()
        }
    }

    else if firstBody.categoryBitMask == PhysicsCat.Ball && secondBody.categoryBitMask == PhysicsCat.Wall {

        enumerateChildNodesWithName("wallPair", usingBlock: ({
            (node, error) in

            node.speed = 0
            self.removeAllActions()

        }))
        if died == false{
            died = true
            Ball.physicsBody?.velocity = CGVectorMake(0, 0)

            createBTN()
        }
    }
}

我需要第二次碰撞检测,它与上面的代码完全分开^^。我该如何将它们分开?我不认为你不能有两个 didBeginContact 。我希望这不会太模糊或不清楚。显然我需要第二个节点,称之为 colorNode。如何检测我的球和 colorNode 之间的碰撞(colorNode 比我的 ScoreNode 低约 200 像素,因此它们不在同一位置),而不弄乱我检测球和墙壁之间碰撞的代码?

最佳答案

您不需要单独的碰撞检测。你需要做的就是处理didBeginContact中的事情。所有这些 if-else 都用它们的 || 检查&& 变得相当笨拙。 (例如,您的最后一个 else 执行的检查已经在前一个 else 中执行过)。

下面的代码是一次不错的尝试,旨在使 if 逻辑更加合理。创建一个 Bool 来处理我们感兴趣的每种类型的存在。

func didBeginContact(contact: SKPhysicsContact) {
    let firstBody = contact.bodyA
    let secondBody = contact.bodyB

    let ballWasContacted = firstBody.categoryBitMask == PhysicsCat.Ball || secondBody.categoryBitMask == PhysicsCat.Ball
    let wallWasContacted = firstBody.categoryBitMask == PhysicsCat.Wall || secondBody.categoryBitMask == PhysicsCat.Wall
    let scoreWasContacted = firstBody.categoryBitMask == PhysicsCat.Score || secondBody.categoryBitMask == PhysicsCat.Score

既然这个逻辑已经以相当合理的方式定义了,那么您就可以进行实际的碰撞检查,您真正会获得返回:

if ballWasContacted {
    if scoreWasContacted {
        score += 1
        scoreLbl.text = "\(score)"
        let scoreNode = firstBody.categoryBitMask == PhysicsCat.Score ? firstBody.node : secondBody.node
        scoreNode!.removeFromParent()
    } else if wallWasContacted {
        enumerateChildNodesWithName("wallPair", usingBlock: ({
            (node, error) in
            node.speed = 0
            self.removeAllActions()
        }))
        if died == false {
            died = true
            createBTN()
            fallDie()
        }
    }
}

这应该会让处理另一个球和碰撞物体变得更容易。您只需要一个 PhysicsCat.Color 和另一个 Bool。然后只需将另一个 else if 挂到最后一个即可。

 else if colorWasContacted {
            // Do stuff
        }

注意:最好也遵循约定。我正在考虑你的命名,不要缩写单词。 scoreLabel 不是 scoreLbl PhysicsCategory 不是 PhysicsCat*

*物理猫?那是薛定谔先生已故的宠物吗?

关于ios - 碰撞检测中断另一个碰撞检测 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37847476/

相关文章:

ios - 核心数据错误 - 语句仍处于事件状态 - 在主线程中

objective-c - 更快的 if 语句 : if `variable` is "value" or "value"

ios - App Store 崩溃报告 EXC_BREAKPOINT (SIGTRAP)

Xcode 4 将图像添加到项目中

ios - 需要帮助在多个 View 上实现滚动条

ios - 自定义扩展 UITableViewCell 有故障?

ios - 您可以将 TestFlight 测试版发送给一部分外部测试人员吗?

ios - 通过在 iOS10+ 上打开本地通知来检测应用是否已启动

ios - 根据 UIView 约束更新 UITableView 大小

swift - 'if case' 语句中的 NOT 条件