2017-06-02 56 views
0

我想使用NSUserdefaults保存一段簡單的信息。我正在嘗試使用bool值來保存SKSprite以使alpha爲1。這是我如何做的。爲什麼這個布爾值不能保存?

第一場景:電平選擇(子畫面alpha是0.2) 當用戶完成程度:(在電平選擇編輯精靈爲1)

GameViewController:

// 
// GameViewController.swift 
// Maze 
// 
// Created by PixelatedAngel on 4/24/17. 
// Copyright © 2017 PixelatedAngel. All rights reserved. 
// 

import UIKit 
import SpriteKit 
import GameplayKit 

public let levelselect = SKScene(fileNamed: "LevelSelect") 

class GameViewController: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    if let view = self.view as! SKView? { 
     // Load the SKScene from 'GameScene.sks' 
     if let scene = levelselect { 
      // Set the scale mode to scale to fit the window 
      scene.scaleMode = .fill 
      // Present the scene 
      view.presentScene(scene) 
     } 
     view.ignoresSiblingOrder = true 
     view.showsFPS = true 
     view.showsNodeCount = true 
    } 
} 

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { 
    if UIDevice.current.userInterfaceIdiom == .phone { 
     return .allButUpsideDown 
    } else { 
     return .all 
    } 
} 

override func viewWillAppear(_ animated: Bool) { 
    //saved data here 
    if let x = UserDefaults.standard.object(forKey: "LevelOne") 
    { 
     isLevelOneCompleted = x as! Bool 
    } 

    if let z = UserDefaults.standard.object(forKey: "LevelTwoButton") 
    { 
     unlockLevelTwoButton = z as! Bool 
     print("Trying to Retrive the value of Level Two Button") 
    } 
} 
} 

級:

// 
// GameScene.swift 
// Maze 
// 
// Created by PixelatedAngel on 4/24/17. 
// Copyright © 2017 PixelatedAngel. All rights reserved. 
// 

import SpriteKit 
import GameplayKit 
import CoreMotion 

public var isLevelOneCompleted = false 
public var unlockLevelTwoButton = false 

class LevelOne: SKScene, SKPhysicsContactDelegate { 
    var levelonescene:SKScene! 
    var player = SKSpriteNode() 
    var endNode = SKSpriteNode() 
    let manager = CMMotionManager() 

override func didMove(to view: SKView) { 
    self.physicsBody = SKPhysicsBody (edgeLoopFrom: self.frame) 
    self.physicsWorld.contactDelegate = self 

    player = self.childNode(withName: "player") as! SKSpriteNode 
    player.physicsBody?.categoryBitMask = 1 
    endNode = self.childNode(withName: "endNode") as! SKSpriteNode 
    endNode.physicsBody?.categoryBitMask = 2 
    manager.startAccelerometerUpdates() 
    manager.accelerometerUpdateInterval = 0.1 
    manager.startAccelerometerUpdates(to: OperationQueue.main){ 
     (data, error) in 

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

func didBegin(_ contact: SKPhysicsContact) { 
    var bodyA = contact.bodyA 
    var bodyB = contact.bodyB 
    let threeStars = SKScene(fileNamed: "LevelCompleted3Star") 

    let fadeAction = SKAction.fadeAlpha(by: 1, duration: 0.45) 

    if bodyA.categoryBitMask == 1 && bodyB.categoryBitMask == 2 || bodyA.categoryBitMask == 2 && bodyB.categoryBitMask == 1{ 
     print("Level One complete") 
     levelOneCompleted() 
     unlockLevelTwo() 
     //3 stars 
     threeStars?.scaleMode = .fill 
     self.view?.presentScene(threeStars!, transition: .fade(withDuration: 0.3)) 
} 
     } 

func levelOneCompleted(){ 
    isLevelOneCompleted = true 
} 

func unlockLevelTwo(){ 
    unlockLevelTwoButton = true 
    print("unlock level two = true") 
}   
} 

3星:

// 
// GameScene.swift 
// Maze 
// 
// Created by PixelatedAngel on 4/24/17. 
// Copyright © 2017 PixelatedAngel. All rights reserved. 
// 

import SpriteKit 
import GameplayKit 
import CoreMotion 

public let levelselectscene = SKScene(fileNamed: "LevelSelect") 

class LevelCompletedThreeStar: SKScene, SKPhysicsContactDelegate { 

    override func didMove(to view: SKView) { 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     if isLevelOneCompleted == true{ 
      print("islevelonecompleted is true..") 
      UserDefaults.standard.set(isLevelOneCompleted, forKey: "LevelOne") 
      UserDefaults.standard.set(unlockLevelTwoButton, forKey: "LevelTwoButton") 
      UserDefaults.standard.synchronize() 
      levelselect?.scaleMode = .fill 
      levelselect?.childNode(withName: "levelTwoButton")?.alpha = 1 
      self.view?.presentScene(levelselect) 
     } 
} 
} 

等級選擇:

// 
// GameScene.swift 
// Maze 
// 
// Created by PixelatedAngel on 4/24/17. 
// Copyright © 2017 PixelatedAngel. All rights reserved. 
// 

import SpriteKit 
import GameplayKit 

class LevelSelect: SKScene { 

    override func didMove(to view: SKView) { 

     if let z = UserDefaults.standard.object(forKey: "LevelTwoButton") 
     { 
      unlockLevelTwoButton = z as! Bool 
      print("Trying to Retrive the value of Level Two Button in Level Select") 
     } 

     if unlockLevelTwoButton == true { 
      levelselectscene?.childNode(withName: "LevelTwoButton")?.alpha = 1 
       UserDefaults.standard.set(unlockLevelTwoButton, forKey: "LevelTwoUnlocked") 
      print("I got this far") 
     } 
    } 

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
     let levelOne = SKScene(fileNamed: "LevelOne") 
     levelOne?.scaleMode = .fill 

     let levelTwo = SKScene(fileNamed: "LevelTwo") 
     levelTwo?.scaleMode = .fill 

     for touch in touches { 
      let location = touch.location(in: self) 
      let node : SKNode = self.atPoint(location) 
      if node.name == "levelOneButton" { 
       self.view?.presentScene(levelOne!, transition: SKTransition.fade(withDuration: 0.2)) 
       } 

      if isLevelOneCompleted == true && node.name == "levelTwoButton"{ 
       self.view?.presentScene(levelTwo!, transition: SKTransition.fade(withDuration: 0.2)) 

      } 
     } 
     } 
    } 
+0

您可以在touchesBegan中添加打印語句,isLevelOneCompleted爲true的塊以及您檢索值爲z的塊 - 確認所有3都按您的預期調用。 – Mozahler

+0

只需指出它,您同時使用「levelTwoButton」和「LevelTwoButton」 – Mozahler

+0

我剛剛完成了您的建議。當第一次運行應用程序時,一切正常。每個打印在Bool更改時都有效。當應用程序關閉並重新打開時,鑰匙未被讀取且打印未顯示。 –

回答

1

在您的視圖控制器,GameViewController,你得到你所儲存的價值。在應用生命週期的後期,您將實例化您的遊戲場景:LevelOne。當初始化LevelOne時,您將全局變量設置爲false [不檢查用戶默認值]。我想知道,如果不是在另一個文件中聲明全局,而是在視圖控制器的頂部定義它,並在檢查用戶默認值後將其設置在viewDidLoad中,它是否會起作用。你甚至可以使全局變量爲靜態的。

+0

我昨天晚上做了這樣的事情,它保存了價值。 :)) –

+0

優秀!恭喜。 – Mozahler

相關問題