如何存储电平数据
How to Store Levels Data
我正在使用 SpriteKit 创建游戏,但我没有在关卡前使用 sks 文件。在发布游戏之前,我不会详细介绍游戏的理念,但基本上每个关卡都是根据一些数字自动生成的。所以本质上定义一个级别的是这些数字,我想知道我可以在哪里存储这些数字。如果我使用 sks 文件,每个级别只有一个文件,但在这种情况下,我应该将它们按级别数组排序吗?数组应该在级别选择 viewcontroller 中吗?应该是单例class吗?
基本上什么是存储这些值的好方法?
那么运行时级别是 auto-generated?
您可以使用关卡数组,或每个关卡一个文件。我只会将它们写入应用程序文档目录中的一个或多个文件。 (我可能会为每个关卡使用一个文件,只是为了保持简单,这样您就可以轻松添加更多关卡,而无需每次都重写整个游戏布局文件。)
如果您使用标量类型、数组和字典构建关卡结构(属性 列表对象),那么您可以使用 属性 将“对象图”写入 属性 列表=11=] 或 NSDictionary
方法 write(to:)
.
或者,您可以使关卡对象符合 Codable
协议,将其转换为 JSON,并将 JSON 数据保存到文件中。 Codable
协议简单易用,Apple 有详细的文档,网上教程也很多。
编辑
请注意,您还可以使用 Codable
协议将数据写入 属性 列表。就像 JSONEncoder
和 JSONDecoder
类 一样,PropertyListEncoder
和 PropertyListDecoder
类 会将您的对象图来回转换为 属性 列表格式。 (二进制属性列表比 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)
}
我正在使用 SpriteKit 创建游戏,但我没有在关卡前使用 sks 文件。在发布游戏之前,我不会详细介绍游戏的理念,但基本上每个关卡都是根据一些数字自动生成的。所以本质上定义一个级别的是这些数字,我想知道我可以在哪里存储这些数字。如果我使用 sks 文件,每个级别只有一个文件,但在这种情况下,我应该将它们按级别数组排序吗?数组应该在级别选择 viewcontroller 中吗?应该是单例class吗? 基本上什么是存储这些值的好方法?
那么运行时级别是 auto-generated?
您可以使用关卡数组,或每个关卡一个文件。我只会将它们写入应用程序文档目录中的一个或多个文件。 (我可能会为每个关卡使用一个文件,只是为了保持简单,这样您就可以轻松添加更多关卡,而无需每次都重写整个游戏布局文件。)
如果您使用标量类型、数组和字典构建关卡结构(属性 列表对象),那么您可以使用 属性 将“对象图”写入 属性 列表=11=] 或 NSDictionary
方法 write(to:)
.
或者,您可以使关卡对象符合 Codable
协议,将其转换为 JSON,并将 JSON 数据保存到文件中。 Codable
协议简单易用,Apple 有详细的文档,网上教程也很多。
编辑
请注意,您还可以使用 Codable
协议将数据写入 属性 列表。就像 JSONEncoder
和 JSONDecoder
类 一样,PropertyListEncoder
和 PropertyListDecoder
类 会将您的对象图来回转换为 属性 列表格式。 (二进制属性列表比 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)
}