我对c#很新,我正在进入XNA。
到目前为止,所有内容都相当简单,我可以找到相关信息,但我一直在努力寻找的有关如何创建游戏保存功能的好建议/教程。
我真的不想使用XML既不保存配置也不保存游戏,因为它只是让价值变化太容易了。所以,我决定使用二进制文件,因为它增加了一层复杂性。
可悲的是,我无法找到有关如何做到这一点的更多信息。 我看到一些帖子建议用户创建一个结构,然后将其保存为二进制文件。
这看起来相当简单(我可以看到完成控件,例如,因为没有那么多变量),但我似乎无法找到有关如何转换实际的信息
public struct controls{
public int forward;
public int back;
}
结构......好吧,真的是二进制文件。
另一个问题是保存游戏数据。
我是否应该采用相同的方法并创建一个结构来保存玩家健康,位置等变量,并在我想加载游戏时加载它?
我想我想问的是 - 是否有可能“冻结”游戏状态(周围的敌人数量,物品掉落等)并稍后加载?
非常感谢任何提示,推动和向正确方向点头的方式。
非常感谢!
答案 0 :(得分:2)
在这种情况下,没有真正的“正确”答案。如果你只是想“加密”数据,为什么不在内存中创建一个xml,然后在保存之前应用首选的criptographic函数来保护它?
当然,这不是一个包罗万象的规则:以二进制格式保存游戏数据会导致磁盘空间占用更少,并且可能更快的加载时间:非常长的数字,例如123456789,只能使用4个字节存储。如果你想将它保存在xml中,由于xml标签和从字符串到int的转换,会产生很多开销。
您的项目的一个好方法是使用序列化器/反序列化器创建一个帮助程序库。每个结构都有自己的结构,当在特定结构上调用时,函数会将结构字段转换为它们的二进制表示形式,将它们连接成字符串并将它们写入文件。这解释了为什么每个结构都需要自己的解串器:由你来选择字段顺序,二进制编码等等。
最后,上述问题可以使用OOP方法以更优雅的方式解决,可能是每个“可存储”类实现可序列化接口,并实现ad hoc序列化方法。
答案 1 :(得分:2)
嗯,简单的回答是肯定的,你可以存储游戏状态。但这主要取决于实际的游戏实施。您必须实现一个/多个数据类,这些数据类将存储对于游戏状态重新创建至关重要的数据。我认为你不能轻易地转储你的游戏内存来恢复状态。您必须使用之前保存的值重新创建游戏场景。 因此,您可以使用这些简单的方法将几乎所有由 Serializable 属性标记的类转换为字节数组:
public static byte[] ToBytes(object data)
{
using (var ms = new MemoryStream())
{
// create a binary formatter:
var bnfmt = new BinaryFormatter();
// serialize the data to the memory-steam;
bnfmt.Serialize(ms, data);
// return a byte[] representation of the binary data:
return ms.GetBuffer();
}
}
public static T FromBytes<T>(byte[] input)
{
using (var ms = new MemoryStream(input))
{
var bnfmt = new BinaryFormatter();
// serialize the data to the memory-steam;
var value = bnfmt.Deserialize(ms);
return (T)value;
}
}
此外,您必须了解二进制序列化的规则。哪些类型可以开箱即用地序列化,哪些类型需要一些解决方法。
然后,您可以选择对该字节序列应用加密/解密,并使用 System.IO.File 保存/加载它。
//read
var data = File.ReadAllBytes("test.dat");
//write
using (var file = File.OpenWrite("test.dat"))
{
file.Write(data, 0, data.Length);
}