簡體   English   中英

碰撞檢測中斷了另一個碰撞檢測-Swift

[英]Collision detection interrupting another collision detection - Swift

截至目前,我有一個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-logic更加明智的嘗試。 創建一個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 *

* PhysicCat? 那是施羅丁格先生的已故寵物嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM