如何在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中找到离场景底部最近的精灵节点的主要内容,如果未能解决你的问题,请参考以下文章