如何存储电平数据

How to Store Levels Data

我正在使用 SpriteKit 创建游戏,但我没有在关卡前使用 sks 文件。在发布游戏之前,我不会详细介绍游戏的理念,但基本上每个关卡都是根据一些数字自动生成的。所以本质上定义一个级别的是这些数字,我想知道我可以在哪里存储这些数字。如果我使用 sks 文件,每个级别只有一个文件,但在这种情况下,我应该将它们按级别数组排序吗?数组应该在级别选择 viewcontroller 中吗?应该是单例class吗? 基本上什么是存储这些值的好方法?

那么运行时级别是 auto-generated?

您可以使用关卡数组,或每个关卡一个文件。我只会将它们写入应用程序文档目录中的一个或多个文件。 (我可能会为每个关卡使用一个文件,只是为了保持简单,这样您就可以轻松添加更多关卡,而无需每次都重写整个游戏布局文件。)

如果您使用标量类型、数组和字典构建关卡结构(属性 列表对象),那么您可以使用 属性 将“对象图”写入 属性 列表=11=] 或 NSDictionary 方法 write(to:).

或者,您可以使关卡对象符合 Codable 协议,将其转换为 JSON,并将 JSON 数据保存到文件中。 Codable 协议简单易用,Apple 有详细的文档,网上教程也很多。

编辑

请注意,您还可以使用 Codable 协议将数据写入 属性 列表。就像 JSONEncoderJSONDecoder 类 一样,PropertyListEncoderPropertyListDecoder 类 会将您的对象图来回转换为 属性 列表格式。 (二进制属性列表比 JSON 更紧凑,读写速度更快。)

下面是一个示例游乐场,它定义了一个自定义结构 FooStruct,使其可编码,然后使用 PropertyListEncoder 将数据写入游乐场的共享数据目录(您必须如果您想测试此代码,请设置)

import UIKit
import PlaygroundSupport


struct FooStruct: Codable {
    let aString: String
    let anotherString: String
    let anInt: Int
}

let fooArray: [FooStruct] = [FooStruct(aString: "Foo 1",
                                      anotherString: "String 1", anInt: 4),
                             FooStruct(aString: "Foo 2",
                                       anotherString: "String 2", anInt: 7)
]

let encoder = PropertyListEncoder()
encoder.outputFormat = .binary

do {
    print(fooArray)
    let data = try encoder.encode(fooArray)
    let plistURL = playgroundSharedDataDirectory.appendingPathComponent("property list.plist")
    try data.write(to: plistURL)
    print("Data written to \(plistURL.path)")
} catch {
    print (error)
}