将游戏数据保存到c#中的二进制文件

时间:2014-02-24 18:22:17

标签: c# xna game-engine xna-4.0

我对c#很新,我正在进入XNA。

到目前为止,所有内容都相当简单,我可以找到相关信息,但我一直在努力寻找的有关如何创建游戏保存功能的好建议/教程。

我真的不想使用XML既不保存配置也不保存游戏,因为它只是让价值变化太容易了。所以,我决定使用二进制文件,因为它增加了一层复杂性。

可悲的是,我无法找到有关如何做到这一点的更多信息。 我看到一些帖子建议用户创建一个结构,然后将其保存为二进制文件。

这看起来相当简单(我可以看到完成控件,例如,因为没有那么多变量),但我似乎无法找到有关如何转换实际的信息

public struct controls{
   public int forward;
   public int back;
}

结构......好吧,真的是二进制文件。

另一个问题是保存游戏数据。

我是否应该采用相同的方法并创建一个结构来保存玩家健康,位置等变量,并在我想加载游戏时加载它?

我想我想问的是 - 是否有可能“冻结”游戏状态(周围的敌人数量,物品掉落等)并稍后加载?

非常感谢任何提示,推动和向正确方向点头的方式。

非常感谢!

2 个答案:

答案 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);
        }
相关问题