我正在设计一款游戏,我想要多达20个节点(子节点为LocationNodes)同时在屏幕上旋转。但是,当我调用以下函数时,我的CPU使用率达到100%且应用程序崩溃。这是spinLocations()函数,它调用存储在locationPositions数组中的节点上的spin:
func spinLocations() {
for (key, val) in locationPositions {
let locationNode = fgNode.atPoint(val) as? LocationNode
let finalLocation = generateRandomLocation()
locationNode?.spin(locationNode!, position: generateRandomLocation(), finalPosition: finalLocation)
locationPositions[key] = finalLocation
}
}
在子类LocationNode中,spin函数如下所示:
func spin(_ locationNode: LocationNode, position: CGPoint, finalPosition: CGPoint) {
self.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.move(to: position, duration: 3.0), SKAction.move(to: finalPosition, duration: 3.0)]))
}
如何重写此内容以免崩溃?
答案 0 :(得分:1)
函数spin
似乎是正确的,但我总是喜欢只有在它自己还没有运行的情况下才执行它,这样你就可以避免因为未执行的节点执行操作或置换而产生strangness:
func spin(_ locationNode: LocationNode, position: CGPoint, finalPosition: CGPoint) {
if self.action(forKey: "spin") == nil {
self.run(SKAction.sequence([SKAction.wait(forDuration: 3.0), SKAction.move(to: position, duration: 3.0), SKAction.move(to: finalPosition, duration: 3.0)]), withKey:"spin")
}
}
条件强制转换操作符as?
尝试执行转换,但如果不能则返回nil
。因此,其结果是可选的。
您可以在执行时使用for-in循环遍历字典中的键值对,但是应该检查使用atPoint
检索的节点类型的类型:
for (key, val) in locationPositions {
let locationNode = self.atPoint(val as! CGPoint)
if locationNode is LocationNode {
let finalLocation = generateRandomLocation()
locationNode.spin(locationNode!, position: generateRandomLocation(), finalPosition: finalLocation)
locationPositions[key] = finalLocation
}
}