2014-02-24 37 views
1

我對c#相當陌生,並且正在進入XNA。將遊戲數據保存到c#中的二進制文件中#

到目前爲止,一切都很簡單,我可以找到它的信息,但我一直在努力尋找的一件事是找到關於如何創建遊戲保存功能的好技巧/教程。

我真的不想用XML來保存配置,也沒有遊戲,因爲它只是讓價值變得太簡單了。所以,我決定去二進制文件,因爲它增加了一層複雜性。

很遺憾,我無法找到有關如何做到這一點的許多信息。 我看到一些帖子建議用戶創建一個結構,然後將其保存爲二進制文件。

這看起來非常簡單(我可以看到,正在與對照完成,例如,因爲沒有那麼多的變量),但我似乎無法找到如何實際

轉換信息
public struct controls{ 
    public int forward; 
    public int back; 
} 

結構......嗯,真的是一個二進制文件。

另一個問題是保存遊戲數據。

我是否應該採用相同的方法並創建一個結構體,這個結構體將像玩家的健康狀況,位置等變量保存下來,並在我想加載遊戲時加載它?

我猜我想問的是 - 是否有可能「凍結」遊戲狀態(周圍敵人的數量,物品掉落等)並在稍後加載?

任何提示,推動和點頭朝着正確的方向將非常感激。

非常感謝!

+0

最終,如果用戶可以訪問保存文件,他們可以找到一種編輯方式,所以您可以做的最多的就是加密它。加密的XML或JSON可能是你想要的。至於「凍結」遊戲狀態,你當然可以把所有的東西都可以序列化,但這可能比你需要的更多。你更簡化的方法可能會更好。 – Magus

+0

RunUO有一些二進制存儲,您可以利用它:https://github.com/runuo/runuo/tree/master/Server/Persistence – hyru

回答

2

好吧,簡單的回答是,你可以存儲遊戲狀態。但這主要取決於實際的遊戲實現。您必須實現一個/幾個數據類,這些數據類將存儲遊戲狀態重現的重要數據。我認爲你不能輕易地轉儲你的遊戲內存來恢復狀態。您必須使用先前保存的值重新創建遊戲場景。 所以,你可以使用這些簡單的方法,幾乎​​所有的類標誌着序列化屬性字節數組轉換:

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); 
     } 
2

在這種情況下,沒有一個真正的「正確的」答案。如果你只是想「加密」數據,爲什麼不在內存中創建一個xml,然後在保存之前應用你喜歡的criptographic函數來保護它?

當然,這不是一個全面的規則:以二進制格式保存遊戲數據會導致磁盤佔用的空間更少,也可能更快的加載時間:只能使用4個字符來存儲非常長的數字,例如123456789字節。如果你想將它保存在xml中,由於xml標籤,以及從字符串到int的轉換,會有很多開銷。

您的項目的一個好方法是創建一個帶有序列化器/反序列化器的輔助函數庫。每個結構都有自己的結構,當在特定的結構上調用時,函數會將結構字段轉換爲二進制表示形式,並將它們串聯起來並將它們複製到文件中。這就解釋了爲什麼每個結構都需要它自己的解串器:這取決於你選擇字段的順序,二進制編碼等。

最後,上面的問題可以用一種更優雅的方式使用OOP方法解決,也許每個「可存儲」類實現可序列化的接口,並實現特設的串行化方法。

相關問題