如何正确删除 SKSpriteNode

How to remove a SKSpriteNode correctly

我正在 Swift 3SpriteKit 做一个小游戏。我想与我的角色和一个特殊物体发生碰撞,使我的分数增加 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)"

}

问题是碰撞检测以 60fps(相当快)的速度进行。所以在那段时间发生了多次碰撞检测。你只是处理第一个。

我通常喜欢在我可以触发的对象上设置一个 属性 以便我知道该对象是否已经发生碰撞,并将其设置为不再检测到碰撞。

在您的情况下,对象只是一个 SKSpriteNode,因此您必须在 userData 中设置 属性 或将对象设为自定义对象并在自定义对象 [=17] 中设置 属性 =]

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)"

}