2016-07-23 4 views
0

Ich baue ein Spiel in SpriteKit, die einen Spieler enthält, um einen Charakter aus 7 Optionen auszuwählen. Szene 1 enthält 7 Bilder. Jedes Bild repräsentiert ein Zeichen. Der Spieler wählt das Zeichen aus, indem er auf das ausgewählte Bild drückt, und die neue Szene 2 wird präsentiert. Ich möchte, dass das ausgewählte Zeichenbild in Szene 2 angezeigt wird. Ich habe Daten des ausgewählten Zeichens in Szene 1 gespeichert, aber wenn Szene 2 angezeigt wird, wird immer Zeichen 1 und nicht ein anderes angezeigt. Bitte geben Sie, was die richtige Codezeile zu var aus Szene 1 zuzugreifen und es zu Szene bringen über 2.Zugriff auf Var aus einer anderen Klasse oder Szene in SpriteKit

import SpriteKit 

class Scene1: SKScene { 

var Player1 = SKSpriteNode() 
var Player2 = SKSpriteNode() 
var Player3 = SKSpriteNode() 
var Player4 = SKSpriteNode() 
var Player5 = SKSpriteNode() 
var Player6 = SKSpriteNode() 
var Player7 = SKSpriteNode() 

var playerSelect1 = false 
var playerSelect2 = false 
var playerSelect3 = false 
var playerSelect4 = false 
var playerSelect5 = false 
var playerSelect6 = false 
var playerSelect7 = false 

// in touches began.. 
if self.nodeAtPoint(location) == self.player1 { 
     playerSelect1 = true 
NSUserDefaults.standardUserDefaults().setBool(true, forKey:"playerSelect1") 

// then i present scene2 

} else if self.nodeAtPoint(location) == self.player2 { 
     playerSelect2 = true 
NSUserDefaults.standardUserDefaults().setBool(true, forKey:"playerSelect2") 

//then i present scene2 

} else if self.nodeAtPoint(location) == self.player3 { 
     playerSelect3 = true 
NSUserDefaults.standardUserDefaults().setBool(true, forKey:"playerSelect3") 

//then i present scene2 

} else if self.nodeAtPoint(location) == self.player4 { 
     playerSelect4 = true 
NSUserDefaults.standardUserDefaults().setBool(true, forKey:"playerSelect4") 

//then i present scene2 
// i didn't list all 7 characters to make code shorter 


class Scene2: SKScene { 
var playerSelected: Scene1() 

// did move to view 
var character1 = SKSpriteNode() 
var character2 = SKSpriteNode() 
var character3 = SKSpriteNode() 
var character4 = SKSpriteNode() 

//grab the selection value 
let playerSelect1 =   NSUserDefaults.standardUserDefaults().boolForKey("playerSelect1") 

let playerSelect2 =   NSUserDefaults.standardUserDefaults().boolForKey("playerSelect2") 

let playerSelect3 =   NSUserDefaults.standardUserDefaults().boolForKey("playerSelect3") 

let playerSelect4 =   NSUserDefaults.standardUserDefaults().boolForKey("playerSelect4") 

if playerSelect1 == true { 
self.addChild(character1) 
} else if playerSelect2 == true { 
self.addChild(character2) 
} else if playerSelect3 == true { 
self.addChild(character3) 
} else if playerSelect4 == true { 
self.addChild(character4) 
} 
} 

Antwort

0

Also lassen Sie uns zum ersten Mal betrachten wählt der Benutzer-Player 1. Sie speichern die ausgewählten Spieler als Bool in NSUserDefaults. Dieser Wert bleibt im lokalen Speicher bestehen, bis Sie ihn ändern, , auch nachdem die App geschlossen wurde. Wenn Sie also Player 2 das nächste Mal auswählen, legen Sie Bool für playerSelect2 fest. Das Problem ist, dass in Scene2 starten Sie Ihre if Anweisung überprüft, ob playerSelect1 == true, was es ist, weil Sie es auf true einmal festgelegt und nie wieder geändert haben. Mit Ihrer aktuellen Methode müssten Sie die gewünschte playerSelect auf true setzen, aber auch alle anderen auf false zurücksetzen. Ich würde empfehlen, Ihre Strategie zu ändern, um eine String entsprechend dem ausgewählten Spieler in NSUserDefaults zu speichern. So etwas sollte dich beginnen.

Wenn Sie den ausgewählten Spieler setzen:

if self.nodeAtPoint(location) == self.player1 { 
    NSUserDefaults.standardUserDefaults().setObject("playerSelect1", forKey: "selectedPlayer") 
else if self.nodeAtPoint(location) == self.player2 { 
NSUserDefaults.standardUserDefaults().setObject("playerSelect2", forKey: "selectedPlayer") 
else if ... 

Wenn Sie ermitteln möchten, welcher Spieler in Scene2 ausgewählt wurde:

//grab the value from local storage 
let selectedPlayer = NSUserDefaults.standardUserDefaults().objectForKey("selectedPlayer") as! String 

if selectedPlayer == "playerSelect1" { 
     //handle player 1 case 
} 
else if selectedPlayer == "playerSelect2" { 
     //handle player 2 case 
} 
1

Über Ihre Frage gibt es viele Möglichkeiten, die Sie folgen können erreiche was du willst. Jetzt benutze ich persönlich nur noch NSUserDefaults wenn ich zB mit einer heutigen Erweiterung kommunizieren muss. Vielleicht möchten Sie Ihre Datendateien auch zu einem späteren Zeitpunkt speichern, damit ich gedacht:

class Settings: NSObject { // NSCoding in case you want to save your data 
    var playerGender: [Bool]! = [Bool]() 
    func encodeWithCoder(aCoder: NSCoder!) { 
     aCoder.encodeObject(playerGender, forKey: "playerGender") 
    } 
    init(coder aDecoder: NSCoder!) { 
     playerGender = aDecoder.decodeObjectForKey("playerGender") as! [Bool] 
    } 
    override init() { 
     super.init() 
     self.playerGender = Array(count:7, repeatedValue:false) 
    } 
} 
class GameManager: NSObject { 
    static let sharedInstance = GameManager() 
    var settings : Settings! = Settings() 
} 
class Scene1: SKScene { 
    let gameManager = GameManager.sharedInstance 
    var player : [SKSpriteNode]? 
    override func didMoveToView(view: SKView) { 
     // in touches began.. 
     if self.nodeAtPoint(location) == self.player1 { 
      gameManager.settings.playerGender[0] = true 
     } 
    } 
} 
class Scene2: SKScene { 
    let gameManager = GameManager.sharedInstance 
    var character : [SKSpriteNode]? 
    override func didMoveToView(view: SKView) { 
     //grab the selection value 
     let playerSelect1 = gameManager.settings.playerGender[0] //it's true 
    } 
} 

Explaination: Settings ist eine Klasse, wo Sie Ihre Spieleinstellungen schreiben, und in Zukunft können Sie auch Speichern Sie die Eigenschaftswerte in einer Datei.

GameManager ist eine gemeinsame Instanz, Sie können es nennen, wo Sie wollen.

Verwandte Themen