2010-01-21 70 views
2

我正在研究一個小型的roguelike遊戲,並且需要一些幫助來創建保存遊戲。我已經嘗試了幾種保存遊戲的方法,但是加載總是失敗,因爲我不確定什麼是標記玩家,實體和地圖的不同部分開始的好方法。二進制文件和保存的遊戲格式

什麼是標記每個部分開頭的好方法,以便數據可以可靠地回讀而不知道每個部分的長度?

編輯:語言是C++。它看起來像一個可讀的格式將是一個更好的鏡頭。感謝所有快速回復。

+3

您使用哪種語言?這可能會影響對狀態對象序列化等建議。 – JMD 2010-01-21 16:54:47

+1

此外,這個非常類似聽起來的問題能幫助你嗎? http://stackoverflow.com/questions/433293/how-to-save-and-load-a-text-mode-game – JMD 2010-01-21 17:00:04

回答

1

如果您有標記,則必須保證該模式在二進制流中的其他位置不存在。如果它確實存在,則必須使用特殊的轉義序列來區分它。 Telnet protocol使用0xFF來標記不屬於數據流的特殊命令。每當數據流包含一個自然發生的0xFF時,它必須被替換爲0xFFFF。

所以你會使用一個2字節的標記來開始一個新的部分,如0xFF01。如果你的讀者看到0xFF01,這是一個新的部分。如果它看到0xFFFF,你會將它摺疊成一個0xFF。當然,你可以擴展這種方法來使用你想要的任何長度標記。 (儘管我的個人偏好是一種文本格式(可選壓縮),或者是一種長度爲字節而不是標記的二進制格式。我不明白如何在不知道讀完數據結構的時候如何序列化它)

+0

感謝您的解釋。我正在考慮將地圖數據(二維數組)保存在單獨的二進制文件中,其餘部分保存在一個文本文件中。 – 2010-01-21 18:39:46

+0

你沒有提到地圖數據 - 這是一個很好的文本格式是CSV – 2010-01-21 19:09:55

2

你確定你需要二進制格式嗎?

爲什麼不以某種文本格式存儲,以便它可以輕鬆解析,無論是純文本,XML還是YAML。

+1

我不得不第二個這個。特別是對於開發來說,讓人們閱讀(甚至更好,可編輯)保存文件是非常有用的。 – Dolphin 2010-01-21 17:02:50

+0

另外,你總是可以壓縮它很好。 ;) – user76035 2010-01-21 17:16:34

3

最簡單的解決方案通常是使用庫來使用XML或INI寫入數據,然後對其進行壓縮。這將更容易解析,並導致比自定義二進制格式更小的文件。
當然,他們會稍長加載(雖然不多,除非你的數據文件的MB 100的)

如果你決定使用二進制格式,看看BER

+1

+1提及BER – 2010-01-21 17:57:33

+0

文件不會很大,所以速度損失根本無法察覺。 – 2010-01-21 18:25:15

2

由於您保存的是二進制數據,因此無法使用沒有長度的標記。 只需寫出任意類型的記錄數然後結構化的數據,那麼它將是 易於再次閱讀。如果你有像字符串這樣的可變長度元素,那麼也需要長度信息。

2 
player record 
player record 
3 
entities record 
entities record 
entities record 
1 
map