Как сохранить и загрузить игровую сцену в Swift? - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь сделать игровую сцену постоянной, состоящей из нескольких слоев спритенодов, чтобы после нажатия кнопки «Пуск» на экране приветствия загружалось последнее сохраненное состояние игровой сцены. Я написал методы кодирования / декодирования в пользовательских классах, которые я инициализирую в 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)
            }
...