如何在 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))")
我有一个函数可以创建下降的 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))")