【问题标题】:Collision detection interrupting another collision detection - Swift碰撞检测中断另一个碰撞检测 - Swift
【发布时间】:2016-06-15 23:30:17
【问题描述】:

到目前为止,我有一个 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 像素,所以它们不在同一个位置),而不会弄乱我检测球和墙壁之间碰撞的代码?

【问题讨论】:

    标签: ios xcode swift collision-detection collision


    【解决方案1】:

    您不需要单独的碰撞检测。你需要做的是处理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不是scoreLblPhysicsCategory不是PhysicsCat*

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2019-04-30
      相关资源
      最近更新 更多