2

私は小さなローグライクゲームに取り組んでおり、セーブゲームの作成についてサポートが必要です。ゲームを保存するいくつかの方法を試しましたが、プレーヤー、エンティティ、およびマップのさまざまなセクションの開始をマークするための適切な方法が正確にわからないため、ロードは常に失敗します。

各セクションの長さを知らなくてもデータを確実に読み戻すことができるように、各セクションの先頭をマークする良い方法は何でしょうか。

編集:言語はC++です。読みやすい形式の方が良いようです。すべての迅速な返信をありがとう。

4

4 に答える 4

3

最も簡単な解決策は、通常、ライブラリを使用してXMLまたはINIを使用してデータを書き込み、それを圧縮することです。これにより、解析が容易になり、カスタムバイナリ形式よりもファイルが小さくなります。
もちろん、ロードには少し時間がかかります(ただし、データファイルが数百MBでない限り、それほど多くはありません)。

バイナリ形式を使用することにした場合は、BERを確認してください。

于 2010-01-21T17:00:27.843 に答える
2

本当にバイナリ形式が必要ですか?

プレーンテキスト、XML、YAMLなど、簡単に解析できるように、テキスト形式で保存してみませんか。

于 2010-01-21T16:59:01.280 に答える
2

バイナリデータを保存しているため、長さのないマーカーを使用することはできません。任意のタイプのレコード数を書き込んでから構造化データを書き込むだけで、再度読みやすくなります。文字列のような可変長の要素がある場合は、長さの情報も必要です。

2
player record
player record
3
entities record
entities record
entities record
1
map
于 2010-01-21T17:46:41.663 に答える
1

マーカーがある場合は、パターンがバイナリストリームの他の場所に存在しないことを保証する必要があります。存在する場合は、区別するために特別なエスケープシーケンスを使用する必要があります。Telnetプロトコルは、0xFFを使用して、データストリームの一部ではない特別なコマンドをマークします。データストリームに自然に発生する0xFFが含まれている場合は常に、0xFFFFに置き換える必要があります。

したがって、2バイトのマーカーを使用して、0xFF01などの新しいセクションを開始します。読者に0xFF01が表示されている場合、それは新しいセクションです。0xFFFFが表示された場合は、単一の0xFFに折りたたむことになります。当然、このアプローチを拡張して、任意の長さマーカーを使用できます。

(私の個人的な好みは、テキスト形式(オプションで圧縮)またはマーカーの代わりに長さバイトのバイナリ形式ですが、データ構造の読み取りがいつ完了したかを知らずに、どのようにシリアル化するのかわかりません。)

于 2010-01-21T16:55:41.227 に答える