我在这里没有看到这个问题的答案,这让我害怕它非常简单而且我只是遗漏了一些东西,但是这里有.
背景,随意跳过:几年前我跳过了我的学士学位需要一门课程.理论上它是计算机图形学,但自从我离开它以后,它变得更加游戏开发.这很好,因为对我而言,它比填充算法和翻译更有趣,以及它曾经是什么.这是一个每隔一年才提供的第四年课程,但我已经成功地与该部门进行了交谈,让我对同一主题进行了第四年的独立研究并称之为足够好.
"运行"独立研究的教授没有教授实际的计算机图形学课程,所以虽然他是一个聪明的家伙,但这不是他的领域.所以我的大部分问题留给我,一本教科书和互联网.你知道......就像一个独立的研究应该.:)
/背景
我有一个喜欢开发游戏系统以获得乐趣的伙伴.我计划参加他的一款桌面游戏并将其变成使用XNA的电脑游戏.
我没有预见到游戏机制会遇到任何难以克服的挑战,但我很好奇的是大多数游戏如何保存他们的内容?我的意思是在几个方面,希望我可以清楚地表达它们.
以您曾经玩过的任何RPG为例.您可以点击"保存"按钮并保存世界,您的角色信息以及其他必要信息.然后,您可以点击"加载"按钮并将其恢复.
或者是全国人大对话的情况.当我碰到Merchant#853时,他随机吐出3个不同的问候之一.
还有其他我能想到的,但它们实际上只是同一主题的变体.即使有这两个例子,在我看来也可以使用相同的机制,但那个机制是什么?
我已经做了多年的网络开发,所以我的脑海里会自动跳到"数据库!".数据库是解决任何问题的方法.我可以看到它在这里如何工作,但开销似乎很陡峭."这是我的6mb编译游戏......哦和68mb MySQL安装." 或者甚至更糟,因为我正在使用XNA,也许我需要找到一种捆绑SQL Server的方法.:)
我想也许是XML,但这对我来说也不合适.如果我想在XBox上运行它会如何工作?还是Zune?(这些对于我正在做的事情来说不是必需的,但必须有一个解决方案,将其考虑在内.)
谁知道秘密?或者还有一些想法?
谢谢Jeff
Gru*_*bel 10
游戏保存的主要方式有两种,一种是简单的,一种是复杂的.第一种方法是简单地存储当前级别,当前分数和一些其他统计数据.这可以在超级马里奥银河和大多数早期的基于控制台模块的游戏等游戏中看到.保存游戏不会恢复您的确切位置,而是恢复您已完成的级别.这些保存游戏通常非常简单,只需要很少的内存.
第二种方式不仅可以存储您的整体进度,还可以存储每个小细节,例如敌人位置,当前动画帧等等,这样加载一个保存游戏就会将您置于停止的确切位置,敌人就位,而不是在一个关卡的开始.这些存档游戏往往比其他版本大得多,因此大多数都可以在PC游戏中看到.
数据库在这些方案中都没有使用,因为数据库的目的是提供动态查询数据结构的能力,但游戏需要的不是查询单个部分的方法,而只是静态存储它们的方法.当一个savegame被加载时,它被完全加载到内存中,并从那里在游戏引擎上对数据进行处理.有一些例外,例如MMORPG可能适用于数据库,但单人游戏通常不会.
数据的实际存储方式取决于游戏.最常见的似乎是简单的二进制数据格式,因为它们在磁盘空间方面比XML要好得多.在较旧的游戏中,这些二进制格式通常会对游戏内存的原始转储进行处理,因此它们没有任何经过深思熟虑的结构,并且当一个补丁或不同版本的游戏发布时经常会破坏,在一些现代游戏中游戏仍然如此.XML也可以用作任何其他基于文本的文件格式.
在很大程度上,这更像是一个游戏设计问题,而不是编程问题,因为它们可以保存游戏的方式可以大大改变它的播放方式.然而,只需几行代码,只需保存级别编号和一些统计信息的简单方法就更容易实现.虽然第二个需要对大多数类进行序列化,但对于复杂的游戏而言,这可能是一个非常棘手的问题并导致许多微妙的错误.
一种方法是使用.net序列化.
确保游戏状态是完全连接的图形,并且该图形中的每个类都标记为Serializable(使用SerializableAttribute),用于保存(和加载)可以使用正常的.net序列化.
您可以查看Project Xenocide(开源XNA游戏)的代码库,看看它是如何在那里完成的.
您可以使用SQLite数据库和SQLite.NET包装器.我用过这个,觉得很简单.整个DLL只有850KB,数据库本身就位于一个文件中(根据需要创建临时文件).所以你的用户应该没有问题.
但您也可以使用简单的XML文件或本地二进制格式.这完全取决于您将如何查询数据以及涉及多少数据.没有一个答案.