Как игры обрабатывают сохраненное содержание?

Поскольку наиболее часто используемым компилятором является gcc, я остановлюсь только на этом. Компилятор может проверить формат & amp; параметры такие же, как у printf

__attribute__ ((format (printf...

Из документации gcc формат

(архетип, индекс строки, первый для проверки) Формат Атрибут указывает, что функция принимает аргументы в стиле printf, scanf, strftime или strfmon, которые должны проверяться типом по строке формата. Например, объявление:

          extern int
          my_printf (void *my_object, const char *my_format, ...)
                __attribute__ ((format (printf, 2, 3)));


causes the compiler to check the arguments in calls to my_printf for consistency with the printf style format string argument

my_format.

The parameter archetype determines how the format string is interpreted, and should be printf, scanf, strftime or strfmon. (You

также может использовать printf , scanf , strftime или strfmon .) Параметр string-index указывает, какой аргумент является аргументом форматной строки (начиная с 1), в то время как first-to-check - это номер первого аргумента, который проверяется на соответствие форматной строке. Для функций, где аргументы недоступны для проверки (например, vprintf), укажите третий параметр как ноль. В этом случае компилятор проверяет только строку формата на согласованность. Для форматов strftime третий параметр должен быть нулевым.

In the example above, the format string (my_format) is the second argument of the function my_print, and the arguments to check start

с третьим аргументом, поэтому правильными параметрами для атрибута формата являются 2 и 3.

The format attribute allows you to identify your own functions which take format strings as arguments, so that GCC can check the

вызывает эти функции для ошибок. Компилятор всегда (если не используется -ffreestanding) проверяет форматы стандартных функций библиотеки printf, fprintf, sprintf, scanf, fscanf, sscanf, strftime, vprintf, vfprintf и vsprintf всякий раз, когда запрашиваются такие предупреждения (с использованием -Wformat), поэтому существует нет необходимости изменять заголовочный файл stdio.h. В режиме C99 также проверяются функции snprintf, vsnprintf, vscanf, vfscanf и vsscanf. За исключением строго соответствующих стандартных режимов C, также проверяется функция X / Open strfmon, как printf_unlocked и fprintf_unlocked. См. Опции Контроля C Диалект. format_arg (string-index) Атрибут format_arg указывает, что функция берет строку формата для функции стиля printf, scanf, strftime или strfmon и изменяет ее (например, чтобы перевести ее на другой язык), чтобы результат можно было передать функция стиля printf, scanf, strftime или strfmon (с остальными аргументами функции форматирования, такими же, как они были бы для неизмененной строки). Например, объявление:

          extern char *
          my_dgettext (char *my_domain, const char *my_format)
                __attribute__ ((format_arg (2)));


causes the compiler to check the arguments in calls to a printf, scanf, strftime or strfmon type function, whose format string argument

является вызовом функции my_dgettext для согласования с аргументом строки формата my_format. Если атрибут format_arg не был указан, то при таких вызовах функций форматирования компилятор мог бы сказать, что аргумент строки формата не является постоянным; это вызовет предупреждение при использовании -Wformat-nonliteral, но вызовы не могут быть проверены без атрибута.

13
задан JeffMc 9 May 2009 в 21:36
поделиться

6 ответов

Один из подходов - использовать сериализацию .net.

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

Вы можете посмотреть кодовую базу для Project Xenocide (игра XNA с открытым исходным кодом), чтобы увидеть, как это было сделано там.

]
6
ответ дан 1 December 2019 в 21:53
поделиться

Вы можете использовать ] База данных SQLite с оболочкой SQLite.NET . Я использовал это, и оказалось, что это довольно просто. Вся DLL составляет всего 850 КБ, а сама база данных находится в одном файле (с временными файлами, создаваемыми по мере необходимости). Так что у ваших пользователей не должно быть проблем.

Но вы также можете использовать простой XML-файл или собственный двоичный формат. Все зависит от того, как вы собираетесь запрашивать данные и какой объем данных используется. Однозначного ответа нет.

5
ответ дан 1 December 2019 в 21:53
поделиться

Как уже отмечали другие, сериализация - это правильный путь. А Гамасутра только что опубликовал статью о запекании данных .

2
ответ дан 1 December 2019 в 21:53
поделиться

Есть два основных способа сохранения игр: простой и сложный. Первый способ - просто сохранить текущий уровень, текущий счет и несколько других характеристик. Это наблюдается в таких играх, как Super Mario Galaxy и в большинстве ранних игр на основе консольных модулей. Сохранение восстанавливает не ваше точное положение, а только то, какие уровни вы прошли. Эти сохраненные игры, как правило, очень просты и требуют очень мало памяти.

Второй способ не только сохраняет ваш общий прогресс, но и сохраняет каждую мелкую деталь, такую ​​как позиции врагов, их текущий кадр анимации и т. Д., Так что загрузка в сохраненной игре вы окажетесь в том месте, где вы остановились, со всеми врагами на своих местах, а не в начале уровня. Эти сохраненные игры имеют тенденцию становиться намного больше, чем другие версии, и поэтому в основном их можно увидеть в играх для ПК.

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

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

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

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

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

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

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

как и любой другой текстовый формат файла.

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

как и любой другой текстовый формат файла.

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

10
ответ дан 1 December 2019 в 21:53
поделиться

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

0
ответ дан 1 December 2019 в 21:53
поделиться

Исходя из моего ограниченного опыта разработки игр, сохраненные игры действительно не занимают много места . Как сказал Тванфоссон, вы обычно храните большинство вещей в памяти во время игры, поэтому сохранение состояния на диск не проблема.

Вот небольшой пример. Предполагая, что это РПГ для одного человека, если вам нужно сохранить только местоположение вашего персонажа, у вас, возможно, будет номер уровня, координаты xyz и, возможно, направление, в котором вы смотрите. Это всего лишь несколько байтов.

Теперь предположим, что вам нужно сохранить состояние / местоположение таких вещей, как аптечки, ящики, враги, здоровье персонажа, поднятые предметы и т. Д. У вас может быть несколько сотен таких вещей, максимум, что было бы легко может быть меньше 10 КБ.

Очевидно, что с более сложными играми все может стать очень сложным. Хитрость заключается в том, чтобы хранить только то, что действительно необходимо для воссоздания опыта игрока. Многие игры позволяют сохранять только в определенных местах, например, в конце уровня. В этом случае вам нужно только сохранить номер нового уровня плюс результат предыдущих уровней (например, оставшееся здоровье, поднятые предметы).

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

РЕДАКТИРОВАТЬ: Что касается формата файла ... используйте любой способ, который удобен для типа данных! XML - довольно хороший способ делать что-то. Не уверен, насколько эффективной будет база данных, поскольку для RPG каждый фрагмент данных может сильно отличаться; У вас может получиться группа таблиц с одной строкой в ​​каждой.

В большинстве игр используются собственные двоичные форматы файлов. Во-первых, это резко снижает объем хранилища. Во-вторых, это помогает предотвратить обман пользователей путем редактирования сохраненной игры вручную - если у вас есть XML, например , очень легко отредактировать файл, чтобы прочитать . Обратной стороной двоичного кода является то, что его намного труднее отлаживать.

1
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: