[英]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.