如何正确地移除SKSpriteNode

3

我正在使用 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)"

}

1
为什么你不使用碰撞委托? - Simone Pistecchia
我应该如何使用碰撞委托?@SimonePistecchia - HessianMad
2
也许你需要阅读一些类似这个链接的教程。 - Simone Pistecchia
1个回答

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

}

很高兴能提供帮助。 - Ron Myschuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接