我想使用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))
}
}
}
}
您可以在touchesBegan中添加打印語句,isLevelOneCompleted爲true的塊以及您檢索值爲z的塊 - 確認所有3都按您的預期調用。 – Mozahler
只需指出它,您同時使用「levelTwoButton」和「LevelTwoButton」 – Mozahler
我剛剛完成了您的建議。當第一次運行應用程序時,一切正常。每個打印在Bool更改時都有效。當應用程序關閉並重新打開時,鑰匙未被讀取且打印未顯示。 –