【问题标题】:Saving High Score Data with Swift使用 Swift 保存高分数据
【发布时间】:2015-06-23 21:47:17
【问题描述】:

我正在尝试使用 Swift 为我的 SpriteKit 游戏保存高分。 StackOverflow 上有几个很好的例子,其中一个我临时工作,但在我所有节点(和实际游戏)所在的 Swift 文件中无法正常运行。

*以下大部分代码来自堆栈溢出答案。

我将这段代码放在一个名为“HighScore”的单独文件中:

import Foundation

class HighScore: NSObject {

var highScore: Int = 0

func encodeWithCoder(aCoder: NSCoder!) {
       aCoder.encodeInteger(highScore, forKey: "highScore")
}

init(coder aDecoder: NSCoder!) {
    highScore = aDecoder.decodeIntegerForKey("highScore")
}

override init() {
}
}

class SaveHighScore:NSObject {

var documentDirectories:NSArray = []
var documentDirectory:String = ""
var path:String = ""

func ArchiveHighScore(#highScore: HighScore) {
    documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    documentDirectory = documentDirectories.objectAtIndex(0) as String
    path = documentDirectory.stringByAppendingPathComponent("highScore.archive")

    if NSKeyedArchiver.archiveRootObject(highScore, toFile: path) {
        println("Success writing to file!")
    } else {
        println("Unable to write to file!")
    }
}

func RetrieveHighScore() -> NSObject {
    var dataToRetrieve = HighScore()
    documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    documentDirectory = documentDirectories.objectAtIndex(0) as String
    path = documentDirectory.stringByAppendingPathComponent("highScore.archive")
    if let dataToRetrieve2 = NSKeyedUnarchiver.unarchiveObjectWithFile(path) as? HighScore {
        dataToRetrieve = dataToRetrieve2
    }
    return(dataToRetrieve)
}
}

在我真正想要获得高分的输入和输出的场景中:

 var Score = HighScore()

    override func viewDidLoad() {
        super.viewDidLoad()

    Score.highScore = 100
    SaveHighScore().ArchiveHighScore(highScore: Score)
    var retrievedHighScore = SaveHighScore().RetrieveHighScore() as HighScore
    println(retrievedHighScore.highScore)

    }

所以当特定节点通过“块”时,高分应该相应增加,然后保存数字(只要它高于当前高分。)

 func blockRunner() {

    Score.highScore = 0
    SaveHighScore().ArchiveHighScore(highScore: Score)
    var retrievedHighScore = SaveHighScore().RetrieveHighScore() as! HighScore
    println(retrievedHighScore.highScore)


    for(block, blockStatus) in blockStatuses {
        var thisBlock = self.childNodeWithName(block)!
        if blockStatus.shouldRunBlock() {
            blockStatus.timeGapForNextRun = random()
            blockStatus.currentInterval = 0
            blockStatus.isRunning = true
        }

        if blockStatus.isRunning {

            if thisBlock.position.x > blockMaxX {
                thisBlock.position.x -= CGFloat(groundspeed)
            }
            else{
                thisBlock.position.x = self.origBlockPositionX
                blockStatus.isRunning = false
                retrievedHighScore.highScore++
                if ((retrievedHighScore.highScore % 5) == 0) {
                    groundspeed++
                }
                self.scoreText.text = String(retrievedHighScore.highScore++)
            }
        }else{
            blockStatus.currentInterval++
        }
    }
}

由于某种原因,它只会递增到 1,然后在 scoreText 中只显示 1,即使它已经通过了多个块。如果我只是声明一个普通变量并将其替换为 retrievedHighScore.highScore++,一切正常。当我使用 retrievedHighScore.highScore 时,它​​只会递增到 1,并且只在 scoreText 中显示 1,奇怪的是,1 甚至没有保存。

【问题讨论】:

    标签: swift save nsdocument


    【解决方案1】:

    我真的建议在这种情况下使用NSUserDefaults 来保持你的高分。我还建议不要为了简单地使用 Integer 变量而创建 highscores 对象。通过使用类来对简单的整数建模,会产生很多不必要的开销。

    所有用于归档高分的代码都可以简化为 1 行:NSUserDefaults.standardUserDefaults().setInteger(highScore, forKey: "Highscore")

    当您需要覆盖高分时(当新的高分要替换旧的高分时)您可以通过再次调用上面的代码行来简单地覆盖旧的高分。

    您节省了大量工作,并且您的代码将更高效地执行。在您的情况下使用类来存储单个值类型是一个糟糕的选择。 Crusty会生气...

    【讨论】:

    • 谢谢开尔文。我仍然对语法有点不清楚。所以说我没有上面的代码,我重新开始:我声明一个“highScore”变量并将其设置为 0。然后我增加“highScore”,运行那行代码,然后 println(Highscore) 和我得到 1。现在,如果我关闭模拟器,删除增量,然后再次 println(Highscore),它等于 0。我究竟如何使用它来保存值?我可以看到一个非常基本的例子吗?谢谢。
    猜你喜欢
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多