保存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】:

不要理会CoreDataUserDefaultsSKNodes 符合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 子类方法?

具有类数组的 SKNode 子级

iOS7 Sprite Kit 我可以存档整个场景并将其用作保存游戏吗?

Python | Python保存高维数组array,Python用pandas将numpy保存csv文件,Python保存3维数组

在CoreData中保存数组的值时,只保存一个值

Matlab保存忽略大单元格数组