2016-07-23 50 views
0

我在SpriteKit中构建了一个游戏,其中包含一个玩家从7个选项中选择一个角色。场景1将包含7个图像。每个图像将代表一个字符。玩家将通过按下所选图像来选择角色,并呈现新场景2。我希望所选字符图像出现在场景2上。我将场景1中选定字符的数据保存起来,但场景2出现时,它始终显示字符1,而不是另一个。请指教一下是正确的代码行从现场1访问变种,并把它交给现场2从SpriteKit中的其他课程或场景中访问var

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

回答

0

因此,让我们考虑第一次用户选择播放器1.您所选择的球员存储为BoolNSUserDefaults。该值将在本地存储中保留,直到您更改它,即使在应用关闭后。因此,下次用户选择玩家2时,您将Bool设置为playerSelect2。问题是,在Scene2你开始你的if语句检查是否playerSelect1 == true,这是因为你将它设置为true一次并且永不改变它。使用您当前的方法,您必须将期望的playerSelect设置为true,但还要将所有其他设置重置为false。我会建议改变你的战略,以存储String对应于选定的球员NSUserDefaults。像这样的东西应该让你开始。

当你想设置所选球员:

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

当你想确定Scene2选择哪个球员:

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

关于您的问题,还有你可以按照多种方式实现你想要的。现在我个人仅在需要与今天的分机进行通信时才使用NSUserDefaults。您可能还需要保存你的数据文件在稍后的时间,所以我认为这样的:

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

Settings是一类,你可以写你的游戏设置,并在将来,你也可以将属性值保存到文件中。

GameManager是一个共享实例,你可以称它为你想要的地方。

相关问题