Двоичный файл и сохраненное форматирование игры - PullRequest
2 голосов
/ 21 января 2010

Я работаю над небольшой игрой в стиле roguelike, и мне нужна помощь в создании сохраненных игр. Я испробовал несколько способов сохранения игр, но загрузка всегда не удалась, потому что я не совсем уверен, что является хорошим способом отметить начало различных разделов для игрока, объектов и карты.

Что было бы хорошим способом обозначить начало каждого раздела, чтобы данные могли надежно считывать данные, не зная длины каждого раздела?

Редактировать: язык C ++. Похоже, что читаемый формат будет лучшим снимком. Спасибо за все быстрые ответы.

Ответы [ 4 ]

3 голосов
/ 21 января 2010

Самым простым решением обычно является использование библиотеки для записи данных с использованием XML или INI, а затем их сжатие. Это будет легче для вас, и вы получите файлы меньшего размера, чем пользовательский двоичный формат.
Конечно, они будут загружаться немного дольше (хотя и не так много, если ваши файлы данных не содержат 100 МБ)

Если вы решили использовать двоичный формат, взгляните на BER .

2 голосов
/ 21 января 2010

Поскольку вы сохраняете двоичные данные, вы не можете использовать маркеры без длины. Просто напишите количество записей любого типа, а затем структурированные данные, тогда это будет легко читать снова. Если у вас есть элементы переменной длины, такие как строка, вам также нужна информация о длине.

2
player record
player record
3
entities record
entities record
entities record
1
map
2 голосов
/ 21 января 2010

Вы действительно уверены, что вам нужен двоичный формат?

Почему бы не сохранить в каком-либо текстовом формате, чтобы его можно было легко разобрать, будь то простой текст, XML или YAML.

1 голос
/ 21 января 2010

Если у вас есть маркер, вы должны гарантировать, что шаблон не существует в другом месте вашего двоичного потока. Если он существует, вы должны использовать специальную escape-последовательность для его дифференциации. Протокол Telnet использует 0xFF для маркировки специальных команд, которые не являются частью потока данных. Всякий раз, когда поток данных содержит естественный 0xFF, он должен быть заменен на 0xFFFF.

Таким образом, вы бы использовали 2-байтовый маркер, чтобы начать новый раздел, например, 0xFF01. Если ваш читатель видит 0xFF01, это новый раздел. Если он увидит 0xFFFF, вы свернете его в один 0xFFFF. Естественно, вы можете расширить этот подход, чтобы использовать любой желаемый маркер длины.

(Хотя мое личное предпочтение - это текстовый формат (необязательно сжатый) или двоичный формат с байтами длины вместо маркеров. Я не понимаю, как вы его сериализуете, не зная, когда вы закончили читать структуру данных. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...