Ich versuche, eine einfache Information mit NSUserdefaults zu speichern. Ich versuche, ein SKSprite zu speichern, um ein Alpha von 1 zu haben, das einen bool Wert verwendet. Hier ist, wie ich es mache.Warum wird dieser Bool-Wert nicht gespeichert?
Erste Szene: Level wählen (Sprite alpha 0.2) Wenn der Benutzer-Ebene abgeschlossen: (edit Sprite in Level auswählen man gleich)
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")
}
}
}
Level One:
//
// 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-Sterne-:
//
// 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)
}
}
}
Level auswählen:
//
// 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))
}
}
}
}
Können Sie eine Druckanweisung in touchesBegan hinzufügen, den Block, in dem isLevelOneCompleted true ist, und den Block, in dem Sie den Wert als z abrufen - alle 3 werden wie erwartet aufgerufen. – Mozahler
Um nur darauf hinzuweisen, verwenden Sie beide "levelTwoButton" und "LevelTwoButton" – Mozahler
Ich habe gerade getan, was Sie vorgeschlagen haben. Alles funktioniert super, wenn die App zum ersten Mal ausgeführt wird. Jeder Druck funktioniert, wenn der Bool gewechselt wird. Wenn die App geschlossen und erneut geöffnet wird, wird der Schlüssel nicht gelesen und der Ausdruck wird nicht angezeigt. –