Как сослаться на несколько SKNodes одновременно в SpriteKit? - PullRequest
0 голосов
/ 13 июня 2018

Чтобы предотвратить много одного и того же кода, я хочу сослаться на каждый отдельный узел (все дочерние элементы одного и того же родителя) на сцене одним вызовом.У меня есть ворота внизу сцены, и я хочу определить, проходит ли какой-либо узел (много разных узлов, добавляемых к сцене) позицию 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)
}

}

Все заглавные буквы являются потомками illustration2, поэтому я подумал о чем-то вроде:

//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из всех узлов на сцене.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Не очень горжусь этим, но вы можете сделать 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.

0 голосов
/ 13 июня 2018

Вы не можете.Вам нужно поместить их в коллекцию (массив, словарь, набор и т. Д.), А затем найти способ их обхода с помощью чего-то вроде 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)
}

То, что это делает, проходит через каждый из ваших узлов и оценивает текущее уравнение с предыдущим результатом.

Итак, мы начинаем с ложного, тогда оно будетпроверьте, если крышка y> иллюстрация y.Если true, то наше значение становится истинным, и это значение переносится на следующий предел.Это повторяется до тех пор, пока у вас не закончатся заглавные буквы, а затем возвращает окончательное значение, которое будет ложным или истинным.

...