我正在Swift 3
和SpriteKit
做一个小游戏。我想与我的角色和一个特殊的物体发生碰撞,使我的分数增加到1,但由于某种原因,当我发现碰撞时,分数会增加2或3.
我从父SpriteKitNode
移除,但它似乎无法正常工作。
这是我的代码:
func checkCollisionsObject(){
enumerateChildNodes(withName: "objeto") {node, _ in
let objeto = node as! SKSpriteNode
if objeto.frame.intersects(self.personaje.frame){
objeto.removeFromParent()
self.actualizarPoints()
//self.labelNivel.text = "Level: \(self.nivel)"
}
}
}
func actualizarPoints() {
self.pointsCounter += 1
points.text = "Points: \(pointsCounter)"
}
答案 0 :(得分:1)
问题是碰撞检测发生在60fps(非常快)。所以在那个时候发生了多次碰撞检测。你只是处理第一个。
我通常喜欢在对象上有一个属性,我可以触发,以便我知道对象是否已经碰撞,并设置它以便它不会再检测到碰撞。
在您的情况下,对象只是一个SKSpriteNode,因此您必须在userData中设置属性或使对象成为自定义对象并在自定义对象类中具有该属性
func checkCollisionsObject(){
enumerateChildNodes(withName: "objeto") {node, _ in
let objeto = node as! CustomObject
if objeto.frame.intersects(self.personaje.frame) && objeto.hasCollided == false {
objeto.hasCollided = true
objeto.removeFromParent()
self.actualizarPoints()
}
}
}
func actualizarPoints() {
self.pointsCounter += 1
points.text = "Points: \(pointsCounter)"
}