碰撞检测中断另一个碰撞检测 - 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 逻辑更合理的 OK-ish 尝试。创建一个 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
*
*物理猫?那是薛定谔先生的已故宠物吗?
截至目前,我有一个 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 逻辑更合理的 OK-ish 尝试。创建一个 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
*
*物理猫?那是薛定谔先生的已故宠物吗?