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

Posted

技术标签:

【中文标题】如何在swift中找到离场景底部最近的精灵节点【英文标题】:how to find closest spritenode to the bottom of scene in swift 【发布时间】:2018-03-01 01:08:43 【问题描述】:

我有一个创建下降 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 
                ...
                
    

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

二元运算符“==”不能应用于“Int”类型的操作数和 '() -> 整数?'

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

【问题讨论】:

【参考方案1】:

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

此外,调用 min 时出现语法错误,但实际上并未调用该函数。需要括号。

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

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))")

【讨论】:

【参考方案2】:

问题是您的语法有缺陷。您想调用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 
            ...
        
    

【讨论】:

以上是关于如何在swift中找到离场景底部最近的精灵节点的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift SpriteKit:如何使子精灵节点的位置和动作与其父精灵节点相同?

Swift 3 - 当布尔为真时如何移动精灵节点?

我如何在视图中保持下降的精灵节点?

图文教程小米4如何获取触动精灵悬浮窗权限

如何在 swift 和精灵套件中使用精灵表?

Sklabel 被精灵覆盖