关于swift:如何在SpriteKit中一次引用多个SKNode?

How to refer to multiple SKNodes at once in SpriteKit?

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

这是我的更新功能现在的外观:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
}

}

所有大写字母都是illustration2的子元素,因此我在考虑以下内容:

1
2
3
4
5
//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 {

        }

或者另一种方法可能是检查illustration2节点在场景中的所有节点中具有最低的y位置。


对此并不感到特别自豪,但是您可以在父节点的子节点上执行forEach

1
2
3
4
5
6
7
8
9
10
11
let node = SKNode()
    var checker = false
    node.children.forEach { (node) in
        if node.position.y < illustration2.position.y {
            checker = true
        }
    }

    if checker {
        // Game over
    }

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

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

您也可以使用过滤器将其单行显示:

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

无论哪种方式,我都将其放在SKNode的扩展中。


你不能吗?您需要将它们放入集合(数组,字典,集合等)中,然后找到一种通过诸如foreach,map,compactMap(正式为flatMap),reduce之类的东西遍历它们的方法,在您的情况下,我会使用减少。

1
2
3
4
5
6
7
8
9
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>图y。如果为true,则我们的值变为true,并且该值会延续到下一个上限。它会重复执行此操作,直到用完大写为止,然后返回最终值,该值为false或true。