我有一个创建下降skspritenode的函数。该函数生成一个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
的新手,非常感谢任何建议
答案 0 :(得分: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))")
答案 1 :(得分: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 {
...
}
}
}