保存sknodes数组
Posted
技术标签:
【中文标题】保存sknodes数组【英文标题】:save array of sknodes 【发布时间】:2018-01-27 16:35:24 【问题描述】:我有一个函数可以保存我场景中的所有节点,还有一个可以将它们添加回来(这些在应用程序打开时运行良好)。我遇到的问题是我将如何保存该数组,以便在应用程序重新打开时可以调用它。提前感谢您的帮助。
为我的节点添加了代码,以便更好地了解我想要完成的工作
let bubble = SKShapeNode(circleOfRadius: self.frame.size.width / 12)
bubble.position = testBubble.position
bubble.fillColor = SKColor.black
bubble.strokeColor = SKColor.black
bubble.name = "bubble"
bubble.physicsBody = SKPhysicsBody(circleOfRadius: bubble.frame.height / 2)
bubble.zPosition = 2
let bubbleLabel = SKLabelNode(text: "Bubble")
bubbleLabel.fontColor = UIColor.darkGray
bubbleLabel.fontSize = 10
bubbleLabel.fontName = "MarkerFelt-Thin"
bubbleLabel.position.y = bubble.frame.size.width / 2 -bubble.frame.size.height / 1.65
bubbleLabel.zPosition = 3
self.addChild(bubble)
bubble.addChild(bubbleLabel)
@objc func saveAllNodes()
nodeArray.removeAll()
for node in self.children
nodeArray.append(node)
@objc func addAllNodes()
self.removeAllChildren()
for node in nodeArray
self.addChild(node)
【问题讨论】:
【参考方案1】:您可能正在考虑使用 CoreData 或 UserDefaults。并在应用程序进入前台时将节点加载到 AppDelegate 中,或者(可能更好)在您需要的任何地方的 viewdidload 函数中加载。 您可以在 xdatamodel 中为您的 NodeArrays 使用可转换变量并将其声明为 @NSManaged var [NodeArray]
【讨论】:
【参考方案2】:不要理会CoreData
或UserDefaults
,SKNodes
符合NSCoding
是有原因的,所以请改用 KeyedArchiver。当您的应用关闭时,只需保存场景本身,当您的应用打开时,重新加载它。
注意这是针对 Swift 3 的,不确定 Swift 4 与 Codable
的变化有多大,但想法应该还是一样的。
extension SKNode
func getDocumentsDirectory() -> URL
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
return paths[0]
func save()
let fullPath = getDocumentsDirectory().appendingPathComponent(name)
let data = NSKeyedArchiver.archivedData(withRootObject: scene)
do
try data.write(to: fullPath)
catch
print("Couldn't write file")
static func load(name:String) -> SKNode?
let fullPath = SKScene.getDocumentsDirectory().appendingPathComponent(name)
guard let node = NSKeyedUnarchiver.unarchiveObject(withFile: fullPath.absoluteString) as? SKNode
else
return nil
return node
然后使用它,当你需要保存你的场景时,只需在你的场景文件中调用save()
,并加载它调用
guard let scene = SKNode.load("*myscenename*") as? SKScene
else
//error out somehow
view.presentScene(scene)
要扩展 NSCoding 的正常功能,您还需要实现编码和解码。这适用于当您自定义类并添加变量时
编码:
func encode(with coder:NSCoder)
coder.encode(variable, forKey:"*variable*")
解码:
required init(coder decoder:NSCoder)
super.init(coder:decoder)
if let variable = decoder.decodeObject(forKey:"*variable*") as? VariableType
self.variable = variable
【讨论】:
以上是关于保存sknodes数组的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SKNode.children 数组访问 SKNode 子类方法?
iOS7 Sprite Kit 我可以存档整个场景并将其用作保存游戏吗?
Python | Python保存高维数组array,Python用pandas将numpy保存csv文件,Python保存3维数组