fra*_*nki 5 store scene ios sprite-kit swift
我用“GameViewController.swift”构建了一个快速游戏
import UIKit
import SpriteKit
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! SKView
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
skView.presentScene(scene)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个名为“GameScene”的场景(当您打开 swift 并创建一个新的 swift 游戏时,它是默认的游戏文件)
import UIKit
import SpriteKit
class GameScene: SKScene{
var building = SKSpriteNode()
override func didMoveToView(view: SKView) {
/* Setup your scene here */
}
Run Code Online (Sandbox Code Playgroud)
那里发生了很多事情。(可以放置建筑物并触发一些操作等)
但是当您离开应用程序时,所有进度都会丢失。
如何保存这个“GameScene”的整个进度并在开始时重新加载它?
您可以在applicationDidEnterBackground(_:)事件中存档您的游戏状态。订阅NotificationCenter即可收到通知。
class GameScene : SKScene {
required init?(coder decoder: NSCoder) {
super.init(coder: decoder)
NotificationCenter.default.addObserver(self, selector: #selector(applicationDidEnterBackground), name: .UIApplicationDidEnterBackground, object: nil)
}
func applicationDidEnterBackground() {
// Save Scene
let sceneData = NSKeyedArchiver.archivedData(withRootObject: self)
UserDefaults.standard.set(sceneData, forKey: "currentScene")
}
class func loadScene() -> SKScene? {
var scene: GameScene?
if let savedSceneData = UserDefaults.standard.object(forKey: "currentScene") as? NSData,
let savedScene = NSKeyedUnarchiver.unarchiveObject(with: savedSceneData as Data) as? GameScene {
scene = savedScene
} else {
scene = nil
}
return scene
}
}
Run Code Online (Sandbox Code Playgroud)
场景加载发生在 中viewDidLoad,首先尝试定位以前存档的场景,或者如果不存在存档场景则创建新场景。
class GameViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
if let view = self.view as! SKView? {
guard let scene = GameScene.loadScene() ?? SKScene(fileNamed: "GameScene") as? GameScene else {
fatalError("Scene not loaded")
}
scene.scaleMode = .resizeFill
view.presentScene(scene)
view.ignoresSiblingOrder = true
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如其他答案中提到的,您还需要使游戏元素NSCoding兼容。
SKScene 符合 NSCoding,因此您可以使用它来存档您的场景。这是一个可能有帮助的教程。https://www.hackingwithswift.com/read/12/3/fixing-project-10-nscoding
基本思想是获取场景实例,并使用以下命令将其存档:
NSKeyedArchiver.archivedData(withRootObject: scene)
然后将其保存到磁盘或其他地方
然后您可以稍后使用以下命令取消存档
NSKeyedUnarchiver.unarchiveObject(with: scene) as! SKScene
现在,当您创建自定义场景类时,您需要确保包含您创建的需要保存的任何变量。这就是令人讨厌的required init(coder aDecoder:NSCoder)初始化器出现的地方,人们往往不使用它。
您基本上使用此初始值设定项来解码自定义变量,如下所示。
required init(coder aDecoder: NSCoder) {
player = aDecoder.decodeObject(forKey: "player") as! String
}
Run Code Online (Sandbox Code Playgroud)
要将其保存到存档中,您需要添加一个编码方法
func encode(with aCoder: NSCoder) {
aCoder.encode(player, forKey: "player")
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2149 次 |
| 最近记录: |