Как сохранить уровень пользователя в моей игре? - PullRequest
0 голосов
/ 03 января 2019

У меня есть игра-лабиринт, которую я написал с помощью swift, которая не сохраняет уровни. В настоящее время, когда пользователь закрывает приложение, ничего не сохраняется, и пользователь должен снова начать играть в игру с уровня 1. У меня есть разные файлы .swift и .sks для каждого уровня, поэтому я не уверен, как сохранить данные уровня между классами / файлами.

Я пытался использовать UserDefaults, однако я не уверен, как сохранить «путь к файлу» до моего уровня. Я знаю, что мне нужно реализовать что-то в моем AppDelegate (используя функцию applicationWillTerminate или applicationDidEnterBackground), однако я не уверен, какой код (если есть) мне нужно добавить в сами сцены, чтобы сохранить эти данные. Я не работал с сохранением пользовательских данных раньше, поэтому помощь будет принята с благодарностью!

import SpriteKit
import GameplayKit
import CoreMotion
import SceneKit
import UIKit

class GameScene: SKScene, SKPhysicsContactDelegate {

let gameScene = SKScene()

var button: SKNode! = nil
var playerSprite = SKSpriteNode()
var nextNode = SKSpriteNode()

lazy var countdownLabel: SKLabelNode = {
    var label = SKLabelNode(fontNamed: "Helvetica")
    label.horizontalAlignmentMode = .center
    label.verticalAlignmentMode = .center
    label.color = UIColor.red
    label.text = "\(counter)"
    return label
}()

var counter = 30
var counterTimer = Timer()
var counterStartValue = 30

let motionManager = CMMotionManager()

override func didMove(to view: SKView) {

    self.scene?.scaleMode = SKSceneScaleMode.aspectFit

    button = SKSpriteNode(imageNamed: "redoButton")
    button.position = CGPoint(x: 350, y: 585);
    self.addChild(button)

    countdownLabel.position = CGPoint(x: 0.5, y: 0.5)
    addChild(countdownLabel)

    counter = counterStartValue
    runTimer()

    self.physicsWorld.contactDelegate = self

    playerSprite = self.childNode(withName: "playerSprite") as! SKSpriteNode
    nextNode = self.childNode(withName: "nextNode") as! SKSpriteNode

    motionManager.startAccelerometerUpdates()
    motionManager.accelerometerUpdateInterval = 0.1
    motionManager.startAccelerometerUpdates(to: OperationQueue.main) {
        (data,error) in

        self.physicsWorld.gravity = CGVector(dx: CGFloat((data?.acceleration.x)!) * 10, dy: CGFloat((data?.acceleration.y)!) * 10)
    }
}

func didBegin(_ contact: SKPhysicsContact) {
    let bodyA = contact.bodyA
    let bodyB = contact.bodyB

    if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 2 || bodyA.categoryBitMask == 2 && bodyB.categoryBitMask == 1{

        playerSprite.removeFromParent()
        nextNode.removeFromParent()
        self.removeFromParent()
        let transition = SKTransition.fade(withDuration: 0.5)
        let gameScene2 = GameScene2(fileNamed: "GameScene2")
        gameScene2!.scaleMode = SKSceneScaleMode.aspectFit
        self.view?.presentScene(gameScene2!, transition: transition)

    }
}


func runTimer() {
    counterTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(decrementCounter), userInfo: nil, repeats: true)
    }


@objc func decrementCounter() {
    counter -= 1
    countdownLabel.text = "\(counter)"

    if countdownLabel.text! < "0" as String {
        countdownLabel.text = "Game Over"
        playerSprite.removeFromParent()
        nextNode.removeFromParent()


    }
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    if let touch = touches.first {
        if touch.view == self.button {
            print("Yay!!!")

        } else {

            playerSprite.isHidden = false
            nextNode.isHidden = false

            let gameScene = GameScene(fileNamed: "GameScene")
            gameScene!.scaleMode = SKSceneScaleMode.aspectFit
            let transition = SKTransition.fade(withDuration: 0.5)
            self.view?.presentScene(gameScene!, transition: transition)
        }

    }
}

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered

}

}

1 Ответ

0 голосов
/ 03 января 2019

сохраните его в виде строки

UserDefaults.standard.set(StateOftheGame, forKey: "levelPass")

, а затем в делегате приложения проверьте, является ли пользователь 'passLevel' при запуске игры в

didFinishLaunchingWithOptions -> add function passLevel ()

func passLevel() {
        if UserDefaults.standard.value(forKey: "levelPass") != nil
        {
            let VC = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "YOURVIEWCONTROLLERWITHSAVESTATE")
            let navVC = UINavigationController(rootViewController: VC)
            let share = UIApplication.shared.delegate as? AppDelegate
            share?.window?.rootViewController = navVC
            share?.window?.makeKeyAndVisible()
        }


    }
...