如何在C ++中为游戏保存和加载用户配置文件?

时间:2009-10-30 20:38:49

标签: c++ parsing config

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

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

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

7 个答案:

答案 0 :(得分:2)

如何制作代表您的配置然后序列化的C ++类?以boost序列化为例。

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

答案 1 :(得分:2)

我使用的Lua重量轻,效果很好as a configuration language。随着岁月的流逝,我开始越来越多地使用Lua脚本,直到核心引擎的所有内容都在Lua中编码。在最新的迭代中,甚至游戏动态也使用回调编码在Lua中,而且性能几乎没有。我不是说你应该这样做但是Lua会让你成长并且很容易在c / c ++中实现。

答案 2 :(得分:2)

Google Protocol Buffers

我认为,serializationmessaging之间存在长期混淆。

<强>序列化

通常是短暂的,包括绕过物体。

正如文章中所述,COMCORBA是其使用的众所周知的例子。

<强>信息

关于不同实体之间的沟通。


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

但这不适应。

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

问题在于,如果序列化与稳定模型运行良好,那么模型的任何更改都可能会很痛苦。

另一方面,

消息传递将消息编码和解码与当前模型相关联,因此,只需在消息的编码和解码中处理对模型的更改,模型为摆脱了向后兼容的负担。


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

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

  1. 前向和后向兼容性易于处理
  2. 可以生成人类可读或二进制格式
  3. 可以用各种语言对同一条消息进行编码/解码
  4. 我不必说明为什么1.重要。 2.意味着您可以手动编辑文件以进行调整,3意味着您可以轻松编写GUI或检查脚本。

答案 3 :(得分:1)

  

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

游戏通常使用专有格式存储配置信息,因为它们经常被滥用(想想破解配置文件以增加你拥有的空余时间或你可以使用的弹药)。这些敏感信息通常以二进制形式编写,并且可以加密。如果没有你需要存储的信息会影响游戏玩法,那么继续使用基于文本/标记/人类可读的格式是完全正确的。二进制格式有各自的问题w.r.t平台等(在这方面查找SO的帖子)。

  

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

XML绝对是一个很好的选择,请继续阅读上一节中的评论。它是人类可读的,许多解析器是免费提供的(也很容易写一个)等。脚本完全是一个不同的野兽。你真的需要一个脚本和控制结构和功能吗?这又是一个设计决定,所以由你决定。

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

答案 4 :(得分:1)

您可能对我Message class中的networking library感兴趣。它允许您方便地存储任何类型的数据,具有您想要包含的层次结构/结构。数据可序列化为平台中立的二进制格式。有适用于C,C ++,Java,Python和C#的API,它易于使用。

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

答案 5 :(得分:0)

很多游戏都将这些设置存储在二进制文件中。它会比XML快,但现在我觉得不重要。也许解释一下你对XML文件有什么麻烦,以便我们可以提供帮助。

答案 6 :(得分:0)

IniParser - 易于使用,标准的ini语法,C但是很容易包装在一个类中。