如何在swift中找到最近的spritenode到场景的底部
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在swift中找到最近的spritenode到场景的底部相关的知识,希望对你有一定的参考价值。
我有一个创建下降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
的新手,任何建议都会非常感激
对每个匹配的节点执行闭包,但是存储数组的代码在闭包内,因此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))")
问题是你的语法有缺陷。你想调用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中找到最近的spritenode到场景的底部的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 带有 SpriteNodes 和 UILabel 的 NSLayout 表