我用“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)
}
}
}
我有一个名为“GameScene”的场景(当您打开 swift 并创建一个新的 swift 游戏时,它是默认的游戏文件)
import UIKit
import SpriteKit
class GameScene: SKScene{
var building = SKSpriteNode()
override func didMoveToView(view: SKView) {
/* Setup your scene here */
}
那里发生了很多事情。 (可以放置建筑物并触发一些动作等等)
但当您离开应用程序时,所有进度都会丢失。
如何保存这个“GameScene”的整个进度并在开始时重新加载它?
您可以将游戏状态存档在应用程序DidEnterBackground(_:)事件。订阅通过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
}
}
场景加载发生在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
}
}
}
您还需要制作游戏元素NSCoding
符合要求,正如其他答案中提到的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)