【问题标题】:How to Store Levels Data如何存储关卡数据
【发布时间】:2019-07-21 22:23:33
【问题描述】:

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

【问题讨论】:

  • 我不是在谈论用户数据,而是在谈论实际水平。
  • 如果你只需要 5 个数字,那么就使用 UserDefaults
  • 每个级别 5 个数字。对于所有用户来说,它也是相同的数字。我不是在谈论存储游戏/用户数据我在谈论实际关卡我认为使用 UserDefaults 没有多大意义。
  • 如果是在运行时生成的,使用userdefaults。如果它是在构建时生成的,那么只需创建一个 plist
  • 视觉部分是在运行时生成的(sknodes),但它们是基于使用这 5 个数字的算法生成的。

标签: ios swift sprite-kit


【解决方案1】:

所以关卡是在运行时自动生成的?

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

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

或者,您可以使您的关卡对象符合Codable 协议,将其转换为 JSON,并将 JSON 数据保存到文件中。 Codable 协议易于使用,Apple 提供了详细的文档记录,并且有大量在线教程。

编辑

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

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

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

【讨论】:

  • 是的,关卡是在运行时生成的。但我不认为使用多个文件是一个好主意,每个级别只需要 5 个数字。它不像程序生成那样复杂,多次运行相同的 5 个数字将导致相同的级别。我认为 JSON 可能是个好主意。
  • 好的,所以保存一个级别结构数组。这很容易。但是,每次添加新关卡时都会重新编写文件。
  • 所以我可以使用 Playground 生成文件并将其添加到应用程序文件中,然后在用户端应用程序只决定文件吗?
  • 不,我只是提供一些示例 Playground 代码,显示编写自定义结构(或结构数组)的代码是什么样的。您将修改上面的代码以读取您的关卡数据并将其写入应用程序的 Documents 目录中的文件。 (搜索“iOS 文档目录的 URL”以了解如何获取应用程序文档目录中文件的 URL。)
  • (虽然可以,但如果您希望每个人的关卡都相同,您当然可以在您的 Mac 上预先生成关卡文件并将这些预先编写的关卡文件发送到您的应用程序包中。)
猜你喜欢
  • 1970-01-01
  • 2019-05-15
  • 2011-04-21
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-06
相关资源
最近更新 更多