我正在研究一個小型的roguelike遊戲,並且需要一些幫助來創建保存遊戲。我已經嘗試了幾種保存遊戲的方法,但是加載總是失敗,因爲我不確定什麼是標記玩家,實體和地圖的不同部分開始的好方法。二進制文件和保存的遊戲格式
什麼是標記每個部分開頭的好方法,以便數據可以可靠地回讀而不知道每個部分的長度?
編輯:語言是C++。它看起來像一個可讀的格式將是一個更好的鏡頭。感謝所有快速回復。
我正在研究一個小型的roguelike遊戲,並且需要一些幫助來創建保存遊戲。我已經嘗試了幾種保存遊戲的方法,但是加載總是失敗,因爲我不確定什麼是標記玩家,實體和地圖的不同部分開始的好方法。二進制文件和保存的遊戲格式
什麼是標記每個部分開頭的好方法,以便數據可以可靠地回讀而不知道每個部分的長度?
編輯:語言是C++。它看起來像一個可讀的格式將是一個更好的鏡頭。感謝所有快速回復。
如果您有標記,則必須保證該模式在二進制流中的其他位置不存在。如果它確實存在,則必須使用特殊的轉義序列來區分它。 Telnet protocol使用0xFF來標記不屬於數據流的特殊命令。每當數據流包含一個自然發生的0xFF時,它必須被替換爲0xFFFF。
所以你會使用一個2字節的標記來開始一個新的部分,如0xFF01。如果你的讀者看到0xFF01,這是一個新的部分。如果它看到0xFFFF,你會將它摺疊成一個0xFF。當然,你可以擴展這種方法來使用你想要的任何長度標記。 (儘管我的個人偏好是一種文本格式(可選壓縮),或者是一種長度爲字節而不是標記的二進制格式。我不明白如何在不知道讀完數據結構的時候如何序列化它)
感謝您的解釋。我正在考慮將地圖數據(二維數組)保存在單獨的二進制文件中,其餘部分保存在一個文本文件中。 – 2010-01-21 18:39:46
你沒有提到地圖數據 - 這是一個很好的文本格式是CSV – 2010-01-21 19:09:55
最簡單的解決方案通常是使用庫來使用XML或INI寫入數據,然後對其進行壓縮。這將更容易解析,並導致比自定義二進制格式更小的文件。
當然,他們會稍長加載(雖然不多,除非你的數據文件的MB 100的)
如果你決定使用二進制格式,看看BER。
+1提及BER – 2010-01-21 17:57:33
文件不會很大,所以速度損失根本無法察覺。 – 2010-01-21 18:25:15
由於您保存的是二進制數據,因此無法使用沒有長度的標記。 只需寫出任意類型的記錄數然後結構化的數據,那麼它將是 易於再次閱讀。如果你有像字符串這樣的可變長度元素,那麼也需要長度信息。
2
player record
player record
3
entities record
entities record
entities record
1
map
您使用哪種語言?這可能會影響對狀態對象序列化等建議。 – JMD 2010-01-21 16:54:47
此外,這個非常類似聽起來的問題能幫助你嗎? http://stackoverflow.com/questions/433293/how-to-save-and-load-a-text-mode-game – JMD 2010-01-21 17:00:04