1

我需要一种将游戏的用户配置(控件、图形等)保存和加载到文件的方法。我想以跨平台的方式做到这一点,如果我必须使用库,我希望它们具有足够简单的语法。如何保存和加载配置文件,我应该使用什么格式?XML 和 INI 似乎很流行,但我发现的所有解析器都有令人困惑的语法,而且我不知道从哪里开始使用我自己的解析器。

顺便说一句,配置文件可能不会变得太复杂,所以最好是轻量级和快速的。

顺便说一句 - 我正在考虑使用脚本来定义项目之类的东西,但是像 xml 这样的标记语言会更好还是脚本语言(比如我正在使用的 angelscript)会更好?

4

7 回答 7

2

如何创建一个代表您的配置的 C++ 类,然后对其进行序列化?以 boost 序列化为例。

http://www.boost.org/doc/libs/1_40_0/libs/serialization/doc/index.html

于 2009-10-30T21:03:14.397 回答
2

我使用的是轻量级的 Lua,它作为一种配置语言效果很好。随着岁月的流逝,我开始越来越多地使用 Lua 脚本,直到除了核心引擎之外的所有东西都用 Lua 编码。在最新的迭代中,甚至游戏动态都是使用回调在 Lua 中编码的,对性能的影响很小。我不是说你应该这样做,但 Lua 会让你成长,并且很容易在 c/c++ 中实现。

于 2009-10-30T21:23:32.390 回答
2

Google 协议缓冲区

我认为序列化消息传递之间存在长期的混淆。

序列化

通常是短暂的并且涉及传递对象。

如文章中所述,COM并且CORBA是其用途的知名示例。

消息传递

是关于不同实体之间的通信。


问题是许多人在看到消息传递问题时只是想:序列化并完成它。

但这不适应。

对象的序列化意味着能够“编码”对象并恢复它......如果你突然改变你的方式并且一个对象现在是2会发生什么,你如何处理向后兼容性?

这里的问题是,如果序列化在稳定模型上工作得很好,那么模型的任何更改都可能是一件痛苦的事情。

另一方面,消息传递将消息编码和解码与当前模型去关联,因此,模型的更改只需在消息的编码和解码中处理,并且模型摆脱了向后兼容的负担


现在对于配置文件,您可能需要向后兼容。那么选择消息传递解决方案符合您的最大利益。

我建议Google Protocol Buffers,因为它是合理且经过验证的。

  1. 向前和向后兼容性很容易处理
  2. 可以生成人类可读或二进制格式
  3. 可以用多种语言对同一消息进行编码/解码

我不必介绍为什么 1. 很重要。2. 意味着您可以简单地手动编辑文件来调整它, 3. 意味着您可以轻松编写 GUI 或检查脚本。

于 2009-10-30T21:50:33.037 回答
1

我需要一种将游戏的用户配置(控件、图形等)保存和加载到文件的方法。

游戏通常使用专有格式来存储配置信息,因为它们经常被滥用(想想破解配置文件以增加您拥有的备用生命或可以使用的弹药数量)。此类敏感信息通常以二进制形式编写,并且经过很好的加密。如果您不需要存储可能影响游戏玩法的此类信息,那么继续使用基于文本/基于标记/人类可读的格式是完全可以的。二进制格式有自己的一组问题 wrt 平台等(在这方面查找帖子)。

我正在考虑使用脚本来定义项目之类的东西,但是像 xml 这样的标记语言会更好还是脚本语言(比如我正在使用的 angelscript)会更好?

考虑到我在上一节中的评论,XML 绝对是一个不错的选择。它是人类可读的,许多解析器是免费可用的(而且它也很容易编写)等等。脚本是完全不同的野兽。你真的需要一个脚本和控制结构和功能吗?这又是一个设计决定,所以由您决定。

没有一个正确的答案。首先,文本/XML 格式对我来说很好。但是随着时间的推移和游戏复杂性的增加,您可能需要转向 DSL 和二进制形式。

于 2009-10-30T20:47:21.170 回答
1

您可能对我的网络库中的Message 类感兴趣。它使您可以方便地存储任何类型的数据,并且可以包含尽可能多的层次结构/结构。数据可序列化为与平台无关的二进制格式。有适用于 C、C++、Java、Python 和 C# 的 API,并且易于使用。

多年来,我一直在使用它来存储相当复杂的项目文件,它对我来说非常有用。

于 2009-10-30T21:09:43.917 回答
0

许多游戏都将这些设置存储在二进制文件中。它会比 XML 更快,但现在我认为这并不重要。也许解释一下您在使用 XML 文件时遇到的问题,以便我们提供帮助。

于 2009-10-30T20:41:50.930 回答
0

IniParser - 易于使用,标准 ini 语法,C 但在类中包装很简单。

于 2009-10-30T21:29:42.113 回答