如何在 swift 中找到离场景底部最近的精灵节点

how to find closest spritenode to the bottom of scene in swift

我有一个函数可以创建下降的 skspritenodes。该函数创建一个skspritenode,一个动作移动到底部然后删除。它每秒被调用一次。我正在尝试创建一个新函数,它会在给定时间找到这些 skspritenodes 中最低的。我尝试使用 enumeratechildnodes(withname:) 因为所有这些 skspritenodes 都具有相同的名称,然后我将它们的 position.y 附加到一个数组。然后我检查 skspritenode position.y 是否等于 Ints 数组的最小值。如果是那么它将是最低的。

func searchLowest() {
    self.enumerateChildNodes(withName: "ball") {node,_ in
        let sprite = node as! SKSpriteNode

            var distanceArray = [Int]()

                let distance = Int(sprite.position.y)
                distanceArray.append(distance)

                let spritePosition = Int(sprite.position.y)

                if spritePosition == distanceArray.min {
                ...
                }
    }
}

但随后我收到此错误消息:

Binary operator '==' cannot be applied to operands of type 'Int' and '() -> Int?'

我是 SpriteKit 的新手,如有任何建议,我们将不胜感激

问题是你的语法有问题。你想调用 Array.min() 而不是 Array.min,这是由于尾随闭包(你用于 if 语句)编译器推断为函数 Array.min(by:),因此将 Int()->Int? 类型的闭包进行比较时出错。您只需致电 distanceArray.min() 即可解决问题。

但是,您当前的代码似乎存在更大的问题。 distanceArray 应该声明在枚举范围之外,否则它永远只有一个元素,即当前节点的距离。此外,您可能想要检查距离是否小于或等于当前最小值,而不是检查它是否等于最小值。也无需声明 position,因为您已经在 distance.

中存储了完全相同的值
func searchLowest() {
    var distanceArray = [Int]()
    self.enumerateChildNodes(withName: "ball") {node,_ in
        let sprite = node as! SKSpriteNode
        let distance = Int(sprite.position.y)
        distanceArray.append(distance)

        if let currentMin = distanceArray.min(), distance <= currentMin {
            ...
        }
    }
}

为每个匹配的节点执行闭包,但存储数组的代码在闭包内,因此 distanceArray 每次执行仅包含一个元素,并且每个元素都是闭包期间最接近的元素。

此外,您在调用 min 时遇到语法错误,而实际上您并未调用该函数。需要 parens.

这可能不是找到最近球的最佳方法,但我认为这是对您的代码的修改:

var distanceArray = [Int]()
var closestNode : SKSpriteNode?
scene.enumerateChildNodes(withName: "ball") {node,_ in

    if let sprite = node as? SKSpriteNode {
        let distance = Int(sprite.position.y)
        distanceArray.append(distance)
        if distance == distanceArray.min() {
            closestNode = sprite
        }
    }
}
print ("\(String.init(describing: closestNode))")