如何在swift中找到最近的spritenode到场景的底部

问题描述 投票:0回答:2

我有一个创建下降skspritenodes的功能。该函数生成一个skspritenode,动作移动到底部然后删除。它每秒都会被召唤。我正在尝试创建一个新函数,在给定时间找到这些skspritenode中最低的。我试图使用enumeratechildnodes(withname :),因为所有这些skspritenode都有相同的名称,然后我将它们的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'和'() - > Int?'类型的操作数

我是SpriteKit的新手,任何建议都会非常感激

ios swift sprite-kit skspritenode
2个回答
1
投票

对每个匹配的节点执行闭包,但是存储数组的代码在闭包内,因此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))")

0
投票

问题是你的语法有缺陷。你想调用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 {
            ...
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.