2017-06-02 7 views
0

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)) 

      } 
     } 
     } 
    } 
+0

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

+0

Um nur darauf hinzuweisen, verwenden Sie beide "levelTwoButton" und "LevelTwoButton" – Mozahler

+0

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. –

Antwort

1

In Ihrem View-Controller, GameViewController, erhalten Sie den Wert, den Sie gespeichert haben. Später im App-Lebenszyklus instanziieren Sie Ihre Spielszene: LevelOne. Wenn LevelOne initialisiert wird, setzen Sie Ihre globale Variable auf false [ohne Benutzereinstellungen zu überprüfen]. Ich frage mich, ob es einen Unterschied machen würde, wenn Sie Ihr Global nicht in einer anderen Datei deklarieren, sondern oben im View-Controller definieren und nach Überprüfung der Benutzereinstellungen in viewDidLoad festlegen. Sie könnten sogar die globale Variable statisch machen.

+0

Ich habe tatsächlich so etwas gemacht letzte Nacht und es hat den Wert gerettet. :)) –

+0

Ausgezeichnet! Glückwunsch. – Mozahler

Verwandte Themen