Swift 如何在SpriteKit中同时引用多个节点?

Swift 如何在SpriteKit中同时引用多个节点?,swift,xcode,sprite-kit,sknode,Swift,Xcode,Sprite Kit,Sknode,为了防止出现大量相同的代码,我希望通过一次调用引用场景中的每个节点(同一父节点的所有子节点)。我在场景底部有一个门,我想检测是否有任何节点(添加到场景中的许多不同节点)通过该门的y位置 这就是我的更新功能现在的样子: override func update(_ currentTime: TimeInterval) { // code I want to simplify if Cap.position.y < illustration2.position.y || C

为了防止出现大量相同的代码,我希望通过一次调用引用场景中的每个节点(同一父节点的所有子节点)。我在场景底部有一个门,我想检测是否有任何节点(添加到场景中的许多不同节点)通过该门的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)
}

}
覆盖函数更新(\uCurrentTime:TimeInterval){
//我想简化的代码
如果盖位置y<插图2位置y
||第2章位置y<说明2.位置y
||第3章位置y<说明2.位置y
||第4章位置y<说明2.位置y
||第5章位置y<说明2.位置y
||第6章位置y<说明2.位置y
||第7章位置y<说明2.位置y
||第8章位置y<说明2.位置y
||第9章位置y<说明2.位置y
||第10章位置y<说明2.位置y{
//过渡到游戏结束
let transition=SKTransition.crossFade(持续时间:0)
让游戏场景=游戏结束(大小:self.size)
self.view?.presentScene(游戏场景,过渡:过渡)
}
}
所有的大写字母都是插图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 {

        }
//如果任何子对象的y位置低于插图2 y位置,则游戏开始
如果不执行说明2.子项.position.y<不执行说明2.position.y{
}

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

您不能。您需要将它们放入一个集合(数组、字典、集合等),然后找到一种方法,使用foreach、map、compactMap(正式的平面映射)、reduce等遍历它们。在您的情况下,我将使用reduce

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)
}
let caps=[Cap1,Cap2,Cap3,Cap4,Cap5,Cap6,Cap7,Cap8,Cap9,Cap10]
让result=caps.reduce(false,{value,返回值中的cap | | cap.position.y
这样做的目的是通过每个节点,并使用前面的结果计算当前方程


因此,我们从一个false开始,然后它将检查cap y是否>插图y。如果为真,那么我们的值将变为真,并且该值将延续到下一个上限。它会重复此操作,直到您用完上限,然后返回最终值,该值将为false或true。

您不能。您需要将它们放入一个集合(数组、字典、集合等),然后找到一种方法,使用foreach、map、compactMap(正式的平面映射)、reduce等遍历它们。在您的情况下,我将使用reduce

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)
}
let caps=[Cap1,Cap2,Cap3,Cap4,Cap5,Cap6,Cap7,Cap8,Cap9,Cap10]
让result=caps.reduce(false,{value,返回值中的cap | | cap.position.y
这样做的目的是通过每个节点,并使用前面的结果计算当前方程


因此,我们从一个false开始,然后它将检查cap y是否>插图y。如果为真,那么我们的值将变为真,并且该值将延续到下一个上限。它会重复此操作,直到您用完上限,然后返回最终值,该值将为false或true。

对此并不感到自豪,但您可以对父节点的子节点执行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
    }
let node=SKNode()
var checker=false
node.children.forEach{(节点)位于
如果node.position.y<插图2.position.y{
checker=true
}
}
如果检查{
//游戏结束
}
或者,如果只需要具有特定名称的目标,则可以枚举它们:

node.enumerateChildNodes(withName: "all can have same name") { (node, stop) in
        if node.position.y < illustration2.position.y {
            checker = true
        }
    }
node.enumerateChildNodes(使用名称:“所有节点可以有相同的名称”){(节点,停止)在
如果node.position.y<插图2.position.y{
checker=true
}
}
您也可以使用过滤器将其排成一行:

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

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

对此并不感到自豪,但您可以对父节点的子节点执行
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
    }
let node=SKNode()
var checker=false
node.children.forEach{(节点)位于
如果node.position.y<插图2.position.y{
checker=true
}
}
如果检查{
//游戏结束
}
或者,如果只需要具有特定名称的目标,则可以枚举它们:

node.enumerateChildNodes(withName: "all can have same name") { (node, stop) in
        if node.position.y < illustration2.position.y {
            checker = true
        }
    }
node.enumerateChildNodes(使用名称:“所有节点可以有相同的名称”){(节点,停止)在
如果node.position.y<插图2.position.y{
checker=true
}
}
您也可以使用过滤器将其排成一行:

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

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

给他们一组userData(dictionary)并将其放在同一个组中。给他们一组userData(dictionary)并将其放在同一个组中。在更新函数中实现代码之前,我必须添加任何内容吗@永远不要为你的代码感到羞耻,尽你最大的能力编写代码,当别人提供更好的东西时,向他们学习。您的答案绝对没有问题,它确实解决了问题。@Jay23检查程序和节点应该在类级别,而不是在更新函数中,否则一切都正常谢谢@Knight0fDragon i ment more l l