如何在SpriteKit中一次引用多个SKNode?

时间:2018-06-13 11:21:51

标签: swift xcode sprite-kit sknode

为了防止大量相同的代码,我想通过一次调用引用场景中的每个节点(同一父节点的所有子节点)。我在场景底部有一个门,我想检测是否有任何节点(许多不同的节点被添加到场景中)通过了这个门的y位置。

这就是我的更新功能现在的样子:

override func update(_ currentTime: TimeInterval) {
// code I want to simplify

    if Cap.position.y < illustration2.position.y 
    || Cap2.position.y < illustration2.position.y 
    || Cap3.position.y < illustration2.position.y 
    || Cap4.position.y < illustration2.position.y 
    || Cap5.position.y < illustration2.position.y  
    || Cap6.position.y < illustration2.position.y 
    || Cap7.position.y < illustration2.position.y 
    || Cap8.position.y < illustration2.position.y 
    || Cap9.position.y < illustration2.position.y 
    || Cap10.position.y < illustration2.position.y {


     // Transitioning to game over

        let transition = SKTransition.crossFade(withDuration: 0)
        let gameScene = GameOver(size: self.size)
        self.view?.presentScene(gameScene, transition: transition)
}

}

所有大写字母都是插图2的孩子,所以我想的是:

//if the y position of any child is below the illustration2 y position the game over scene starts

if dontaiIllustration2.children.position.y < dontaiIllustration2.position.y {

        }

或者另一种方法可以是检查插图2节点是否具有场景中所有节点的最低y位置。

2 个答案:

答案 0 :(得分:1)

你做不到。你需要将它们放入一个集合(数组,字典,集合等),然后找到一种方法来遍历它们,比如foreach,map,compactMap(正式flatMap),简化等,在你的情况下,我会用减少。

let caps = [Cap1,Cap2,Cap3,Cap4,Cap5,Cap6,Cap7,Cap8,Cap9,Cap10]
let result = caps.reduce(false,{value,cap in return value || cap.position.y < illustration2.position.y})
if result {
    // Transitioning to game over

    let transition = SKTransition.crossFade(withDuration: 0)
    let gameScene = GameOver(size: self.size)
    self.view?.presentScene(gameScene, transition: transition)
}

这是做什么的,正在遍历每个节点,并使用之前的结果评估当前的等式。

所以我们从假开始,然后它会检查cap y&gt;插图如果为真,则我们的值变为真,并且该值继续到下一个上限。它重复这个,直到你用完大写,然后返回最终值,这将是一个假或真。

答案 1 :(得分:1)

并不为此感到自豪,但你可以对父节点的子节点进行forEach

let node = SKNode()
    var checker = false
    node.children.forEach { (node) in
        if node.position.y < illustration2.position.y {
            checker = true
        }
    }

    if checker {
        // Game over
    }

如果您只想要具有特定名称的目标,则可以枚举它们:

node.enumerateChildNodes(withName: "all can have same name") { (node, stop) in
        if node.position.y < illustration2.position.y {
            checker = true
        }
    }

您也可以使用过滤器对其进行单行处理:

node.children.filter({$0.position.y < illustration2.position.y}).count > 0

无论哪种方式,我都会把它放在SKNode的扩展中。