【问题标题】:save array of sknodes保存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)
    }
}

【问题讨论】:

    标签: swift sprite-kit sknode


    【解决方案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
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-30
        • 2014-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多