Я пытаюсь сделать игровую сцену постоянной, состоящей из нескольких слоев спритенодов, чтобы после нажатия кнопки «Пуск» на экране приветствия загружалось последнее сохраненное состояние игровой сцены. Я написал методы кодирования / декодирования в пользовательских классах, которые я инициализирую в didMove (), и я использовал nskeyedarchiver для сохранения игровой сцены, но при загрузке все переменные сцены устанавливаются в ноль. Кнопки отображаются и работают, но они не связаны со сценой, и все они приводят к нулю в отладчике, поэтому все, что я пытаюсь сделать в сцене после загрузки, приводит к сбою. Как мне изменить код, чтобы он работал?
Gamescene
override func didMove(to view: SKView)
{
UNUserNotificationCenter.current().delegate = self
let data = UserDefaults.standard.object(forKey: "bool") as? Bool
if data == false || data == nil
{
NotificationCenter.default.addObserver(self, selector: #selector(Save), name: .Save, object: nil)
UserDefaults.standard.set(true, forKey: "bool")
gameVC?.currentScene = self
let randomPlanetSize = Int.random(in: 160...240)
planet = self.generateWorld(worldTexture: "planet1", position: nil, size: CGSize(width: randomPlanetSize, height: randomPlanetSize), rotationDuration: 300)
planet.zPosition=10
planet.isUserInteractionEnabled=true
self.addChild(planet)
....
backButton = ReturnButton(texture: SKTexture(image: #imageLiteral(resourceName: "backButton2")), color: .white, size: CGSize(width: 60, height: 30),scene: self,position: CGPoint(x: 50, y: frame.height-80),initpos: CGPoint(x: 50, y: frame.height-80),zpos: 10)
self.addChild(backButton!)
}
else
{
backButton?.isUserInteractionEnabled = true
}
}
Кнопка возврата
class ReturnButton: SKSpriteNode {
var scena: Main_GameScene
var initialPosition = CGPoint()
var goback = false
init(texture: SKTexture?, color: UIColor, size: CGSize, scene: Main_GameScene, position: CGPoint,initpos: CGPoint,zpos: CGFloat) {
self.scena = scene
self.initialPosition = initpos
super.init(texture: texture, color: color, size: size)
self.position = position
self.zPosition = zpos
self.isUserInteractionEnabled = true
self.colorBlendFactor = 1
}
required convenience init?(coder aDecoder: NSCoder) {
let scena = aDecoder.decodeObject(forKey: "scenareturn") as! Main_GameScene
let color = aDecoder.decodeObject(forKey: "coloreturn") as! UIColor
let size = aDecoder.decodeCGSize(forKey: "sizereturn")
let text = aDecoder.decodeObject(forKey: "textureturn") as! SKTexture
let pos = aDecoder.decodeCGPoint(forKey: "positionreturn")
let initpos = aDecoder.decodeCGPoint(forKey: "initpositionreturn")
let zpos = aDecoder.decodeObject(forKey: "zposreturn") as! CGFloat
self.init(texture: text, color: color, size: size,scene: scena,position: pos, initpos: initpos, zpos: zpos)
}
override func encode(with aCoder: NSCoder) {
aCoder.encode(self.texture, forKey: "textureturn")
aCoder.encode(self.scena, forKey: "scenareturn")
aCoder.encode(self.color, forKey: "coloreturn")
aCoder.encode(self.size, forKey: "sizereturn")
aCoder.encode(self.position, forKey: "positionreturn")
aCoder.encode(self.initialPosition, forKey:"initpositionreturn")
aCoder.encode(self.zPosition, forKey:"zposreturn")
}
...
Контроллер вида игры
if let data = UserDefaults.standard.object(forKey: "scene") as? Data {
let scene = NSKeyedUnarchiver.unarchiveObject(with: data) as! Main_GameScene
let view = self.view as! SKView?
scene.gameVC=self
view!.allowsTransparency = true
view!.backgroundColor = .clear
scene.backgroundColor = .clear
scene.scaleMode = .resizeFill
view!.ignoresSiblingOrder = false
view!.showsFPS = true
view!.showsNodeCount = false
view!.presentScene(scene)
}