什么是保存游戏状态(配置文件),数据库文本文件的最常用方法或算法,加密方式以及相关内容。
我已经看到Caesar IV使用了mySQL。
有什么建议。
什么是保存游戏状态(配置文件),数据库文本文件的最常用方法或算法,加密方式以及相关内容。
我已经看到Caesar IV使用了mySQL。
有什么建议。
Answers:
我敢肯定,它通常是采用专有(二进制)格式完成的,只需将您使用的任何游戏状态结构的每个变量写入文件中,或将该文件读回到结构的实例中即可。例如,在C ++中,您可以将对象像字节数组一样对待,只需将其fwrite()放入文件中,或从文件中读取fread()并将其转换回其对象形式。
如果您使用的是Java或其他语言,则可以选择使用序列化来简化任务。Java的解释在此答案的底部。当然,其他语言(比C ++更高的语言)也都有自己的序列化库或内置函数,您应该选择使用它们。无论序列化例程的效率如何低下,如今的硬盘空间都很便宜,尤其是在游戏状态不应该太大的情况下,这会阻止您编写和维护自己的序列化例程。
您绝对不应使用MySQL(只需阅读本评论的第一句话)。如果出于某种原因确实需要关系数据库,请使用SQLite。它是一个轻量级的数据库系统,并且存在于单个数据库文件中。但是对于大多数游戏而言,关系数据库并不是走的路,而尝试使用它们的公司通常最终会将它们用作键值查找表,而不是真正的关系数据库。
对本地磁盘文件的任何形式的加密都是模糊的 ; 程序解密后,任何黑客都只会嗅探数据。我个人反对这种事情,尤其是单人游戏。我的观点是,游戏所有者(付费客户,请注意,您可以)可以随意入侵游戏。在某些情况下,它可以带来更大的社区感,并且可以为您的游戏开发“ mod”,从而吸引更多的客户。我想到的最新示例是最近发布的《我的世界》中的Portal mod。它在互联网上的游戏新闻网站上发布,您可以打赌它推动了Minecraft的销售。
如果由于某种原因您真的疯狂到像我一样使用Java进行游戏开发,以下是Java序列化的简要说明:
将所有游戏状态数据保存在一个类中,通过实现使该类可序列化
Serializable
,transient
如果将特殊的实例化变量混合到该类中(临时对象未序列化),则使用关键字,并仅用于ObjectOutputStream
写入文件和ObjectInputStream
从文件读取。而已。
[field: NonSerialized]
如果您正在编写自己的代码(例如使用C ++),则可以使用二进制文件。二进制文件通过混淆为您提供了一种加密形式。但是,正如互联网上记录的那样,这是一种非常薄弱的安全性。
或者,如果您想要人类可读的解决方案,则可以使用RapidXML之类的东西。
如果您使用某种框架,请查看它的文件支持功能。高温超导
在其他一些答案中提到了序列化,我同意这是一个合理的解决方案。它失败的一种方法是版本控制。
假设您发布了游戏,然后人们开始玩并创建了一些保存游戏。然后,在以后的补丁中,您要修复错误或添加一些功能。如果您使用简单的二进制序列化方法,并且向类中添加了成员,则当客户安装补丁时,序列化可能与旧的保存游戏不兼容。
因此,无论使用哪种方法,请确保在首次发布游戏之前就考虑到这个问题!如果客户在应用补丁程序后必须重新开始,他们将不满意。
避免这种情况的一种方法是让每种基本数据类型实现Save(version)和Load(version)方法,这些方法足够聪明,可以知道要为每个游戏版本保存和加载哪些数据。这样,您可以支持保存游戏的向后兼容性,并且如果用户尝试从比其正在运行的新版本的游戏中加载保存游戏,则可以优雅地失败。