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位置。
对此并不感到特别自豪,但是您可以在父节点的子节点上执行
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。