Как вы можете поместить все изображения из игры в 1 файл?

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

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

Ну, вот чего я пытаюсь достичь: я надеюсь упаковать все изображения в 1 файл (возможно, также файлы .txt), после чего сможет прочитать из этого файла или легко добавить к нему.

67 голосов | спросил Bugster 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 10:57:20 +0400 2012, 10:57:20

9 ответов


62

Игровые программисты полагались на один из двух основных способов хранения данных:

  • хранить каждый файл данных в виде отдельного файла
  • хранить каждый файл данных в формате пользовательского архива

Недостатком первого решения является проблема нехватки дискового пространства, а также проблема более медленных установок.

Второе решение обеспечивает свои собственные ошибки, во-первых, вы должны написать все свое собственное изображение /звук /и т. д. которые используют пользовательский API для доступа к архивированным данным. Еще один недостаток заключается в том, что вам нужно написать свою собственную утилиту архива для создания архивов в первую очередь.

Если вы всегда будете загружать все файлы из архива, TAR /GZ может быть не очень хорошей идеей, потому что вы не можете извлекать определенные файлы по мере необходимости. Именно по этой причине многие игры используют ZIP-архивы, которые позволяют вам извлекать отдельные файлы по мере необходимости (хорошим примером является Quake 3, â € <â € <â € <â € <, где PK3-файлы - это ничего, кроме файлов ZIP с другое расширение).

РЕДАКТИРОВАТЬ: «Скрыть» структуру каталогов игр и «Сохранить» только исполняемые файлы

  

Другое решение часто используется для «скрытия» игровых файлов в папке   состав. Храните только свои исполняемые файлы и, возможно, файл readme в главном   и переместите файлы игры в подпапку с именем «данные» или другие связанные.

EDIT: Gamedev Tuts Plus имеют приятный ресурс

EDIT: libarchive

Одно потенциальное решение libarchive, которое представляет собой библиотеку архивирования, которая будет обрабатывать извлечение файлов из архива, таких как ZIP-файл. Он даже позволяет вам назначить извлеченный файл стандартным указателем FILE, что сделает взаимодействие с любыми другими библиотеками потенциально более простым.

EDIT: Файлы формата ZIP с альтернативным расширением

Здесь мне нравится комментарий @Joachim Sauer

  

Использование файлов формата ZIP с альтернативными расширениями   традиция вне игр: Java делает это , OpenDocument   Формат (формат a.k.a. OpenOffice /LibreOffice) делает это , даже Office   Open XML (a.k.a. «новый» формат Microsoft Office) делает это.

ответил yusef ghatavi 31 MaramThu, 31 Mar 2016 03:46:43 +03002016-03-31T03:46:43+03:0003 2016, 03:46:43
39

Другим решением, часто используемым для «скрытия» игровых файлов, является структура папок. Храните только свои исполняемые файлы и, возможно, readme в главном каталоге и переместите файлы игры в «данные» подпапки. Я не думаю, что это очень редко. Многие игры, которые я знаю, хранят их контент таким образом.

ответил tom van green 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 11:21:46 +0400 2012, 11:21:46
22

Мне очень нравится PhysFS . Он позволяет вам получить доступ к папкам или zip-архивам с тем же кодом. Он хорошо работает для всех этапов жизни Игр.

  1. При разработке : доступ к ресурсам напрямую из иерархии папок. Таким образом, сжатые архивы не мешают, и вы можете быстро выполнять итерацию.
  2. Начальное развертывание . Запустите свои ресурсы для быстрого развертывания /быстрой установки. Код не нуждается в изменении. Просто укажите PhysFS на zip вместо папки.
  3. Обновления /Моддинг : PhysFS может загружать несколько архивов zip, где ресурсы от одного переопределяют другой. Обновления могут быть такими же простыми, как новый zip только с измененными файлами. Аналогично для моддинга.

обновление:

Я использовал учебник , включенный в источник, и документацию doxygen , чтобы узнать PhysFS. API действительно довольно прост, вы потратите больше времени на изучение загрузки изображений в SFML через буферы памяти, а не по пути к файлу.

ответил deft_code 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 21:29:16 +0400 2012, 21:29:16
12

Я бы предложил использовать ZIP-файл. Это вездесущий формат, и вы найдете готовые библиотеки, которые позволяют загружать файлы из ZIP-файла. Быстрый поиск Google даже показал zip-загрузчик для sfml .

ответил bummzack 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 11:09:57 +0400 2012, 11:09:57
3

Хорошо, вы могли бы обмануть, как они упомянули :) Вы можете сделать спрайт-лист из изображений, в настоящее время нет необходимости его застегивать, если это не спасет тонну пространства. После того, как вы создадите спрайт-лист или несколько спрайтов с изображений, вы можете просто переименовать их расширения. Большинство геймеров не потрудились проверить и почему бы не оставить этот вариант для художников, которые могут захотеть модерировать свою игру в будущем? Таким образом, они могут также создать спрайт-лист, переименовать его расширение и начать катиться.

С текстовыми файлами я смиренно предлагаю вам преобразовать эти данные в двоичную форму. Я уверен, что вы найдете простой способ сделать это. Например, если вы используете только AZ, az и 0-9, вы можете использовать 6 бит для представления каждого символа, который несколько защитит ваш материал, защищенный авторскими правами, он также не позволит другим редактировать карты. Вы всегда можете добавить конвертер карт, если хотите. Однако Zipping вполне разумен для текста.

ответил wolfdawn 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 17:27:00 +0400 2012, 17:27:00
2

Речь идет не только о количестве ресурсов или дискового пространства.
С большим количеством различных файлов текстур, когда вы используете SFML, который отображает с OpenGL, каждый раз, когда вы собираетесь отображать текстуру, OpenGL необходимо связать следующую текстуру с видеокартой (проверьте glBindTexture ()), и это действительно дорогостоящая задача. С учетом этого вы можете понять, почему игры обычно помещают ряд спрайтов в одну и ту же текстуру, так называемые спрайты, в соответствии с вашими меню /уровнями /картами игры.
Результат - огромный прирост производительности, поскольку вы обрабатываете много спрайтов с тем же вызовом текстурной привязки.

ответил Edmo Freitas 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowTue, 25 Sep 2012 23:40:15 +0400 2012, 23:40:15
2

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

http: //gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/

Листы спрайтов - это совсем другой предмет, но они являются нормой для большинства игр:)

ответил Si Robertson 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 26 Sep 2012 08:23:35 +0400 2012, 08:23:35
1

Другой метод, который вы можете использовать:

Бесплатная версия XnView предоставляет функцию, называемую Strip of Images " (SHIFT + A), который позволяет создавать sprite-collections.

Это минимизирует доступ к файлам и особенно важно для веб-приложений /игр, чтобы свести к минимуму количество HTTP-roundtrips.

Доступ к отдельным изображениям затем предоставляется через карты координат (например, css-определения).

ответил Lorenz Lo Sauer 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 26 Sep 2012 09:44:10 +0400 2012, 09:44:10
0

Сначала вы должны написать все свое собственное изображение /звук /и т. д. которые используют пользовательский API для доступа к архивированным данным. Еще один недостаток заключается в том, что вам нужно написать свою собственную утилиту архива для создания архивов в первую очередь. Если вы не будете всегда загружать все файлы из архива, TAR /GZ может быть не очень хорошей идеей, потому что вы не можете извлекать определенные файлы по мере необходимости. Именно по этой причине многие игры используют ZIP-архивы, которые позволяют вам извлекать отдельные файлы по мере необходимости (хорошим примером является Quake 3, â € <â € <â € <â € <, где PK3-файлы - это ничего, кроме файлов ZIP с другое расширение).      http://zpp-library.sourceforge.net/

ответил 25 J0000006Europe/Moscow 2013, 20:31:03

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132