我正在swift中构建一个sprite kit游戏,当检测到2个节点之间的冲突时,我需要将得分增加1。分数存储在名为animalsCount
的变量中,并输出到标签节点:
//Score count in stats bar
//Animal score count
animalsCount = 0
animalsCountLabel.text = "\(animalsCount)"
animalsCountLabel.fontSize = 45
animalsCountLabel.fontColor = SKColor.blackColor()
animalsCountLabel.position = CGPoint (x: 630, y: 40)
addChild(animalsCountLabel)
碰撞的两个精灵节点是savior
和chicken1
。现在,我使用以下代码保持得分并检测碰撞:
func didBeginContact(contact: SKPhysicsContact) {
//Chicken1
if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue && contact.bodyB.categoryBitMask == ColliderType.Chicken1.rawValue ) {
println("chicken1 contact made")
chicken1.hidden = true
chicken1.setScale(0)
animalsCount++
animalsCountLabel.text = "\(animalsCount)"
} else if (contact.bodyA.categoryBitMask == ColliderType.Chicken1.rawValue && contact.bodyB.categoryBitMask == ColliderType.Savior.rawValue) {
println("chicken1 contact made")
chicken1.hidden = true
chicken1.setScale(0)
}
else if语句中的分数没有增加,因为它不会发生在我的游戏中。
问题在于animalsCount
每次savior
和chicken1
发生碰撞时if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue)
增加2而不是1。
经过一些故障排除后,我发现这不是因为两个碰撞体的分数都在增加。情况并非如此,因为只满足一行代码。这是唯一满足的一条线:
savior
得分上升2而不是1,因为chicken1
似乎"反弹"关闭contact.bodyA.categoryBitMask
,以便每次碰撞发生时,ColliderType.Savior.rawValue
等于strtr
TWICE。
我不知道如何解决这个问题。如何才能使碰撞仅在ONCE中检测到,因此分数只会增加一次?
答案 0 :(得分:2)
我最终使用Int变量解决了问题,该变量控制if语句,因此只能检测到一次碰撞,直到sprite节点循环并且变量被重置。
我声明了一个名为chickenHasBeenGrabbed
的变量,并将其初始设置为0。一旦第一次检测到碰撞,我将chickenHasBeenGrabbed
设置为1.只有在chickenHasBeenGrabbed
设置回0后才能再次检测到碰撞:
func didBeginContact(contact: SKPhysicsContact) {
//Chicken1
if chickenHasBeenGrabbed == 0 {
if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue && contact.bodyB.categoryBitMask == ColliderType.Chicken1.rawValue ) {
println("chicken1 contact made")
chicken1.hidden = true
chicken1.setScale(0)
animalsCount += 1
animalsCountLabel.text = "\(animalsCount)"
chickenHasBeenGrabbed = 1
} else if (contact.bodyA.categoryBitMask == ColliderType.Chicken1.rawValue && contact.bodyB.categoryBitMask == ColliderType.Savior.rawValue) {
println("chicken1 contact made")
chicken1.hidden = true
chicken1.setScale(0)
}
}
else if chickenHasBeenGrabbed == 1 {
if (contact.bodyA.categoryBitMask == ColliderType.Savior.rawValue && contact.bodyB.categoryBitMask == ColliderType.Chicken1.rawValue ) {
println("nothing to do; chicken was already grabbed!")
} else if (contact.bodyA.categoryBitMask == ColliderType.Chicken1.rawValue && contact.bodyB.categoryBitMask == ColliderType.Savior.rawValue) {
println("nothing to do; chicken was already grabbed!")
}}