Acabo de terminar un juego de rol básico escrito en C ++ SFML, he puesto mucho esfuerzo en el juego y me gustaría distribuirlo, sin embargo, me encontré con un pequeño problema.
El problema es que tengo más de 200 imágenes y archivos de mapas (son archivos .txt que contienen códigos de mapas) todos en la misma carpeta que el ejecutable, cuando miro en la carpeta, me dan ganas de llorar un poco al ver tantos recursos, nunca he visto un juego que te muestre todos los recursos directamente, en cambio creo que empaquetan los recursos en un archivo determinado.
Bueno, eso es lo que estoy tratando de lograr: espero empacar todas las imágenes en 1 archivo (tal vez también los archivos .txt) y luego poder leer desde ese archivo o agregarlo fácilmente.
fuente
Respuestas:
Los programadores de juegos se han basado en uno de los dos métodos principales de almacenamiento de datos:
El inconveniente de la primera solución es el problema del espacio de disco desperdiciado, así como el problema de las instalaciones más lentas.
La segunda solución proporciona sus propias trampas, primero es que debe escribir toda su propia imagen / sonido / etc. cargar rutinas que usan una API personalizada para acceder a los datos archivados. Otro inconveniente es que, en primer lugar, debe escribir su propia utilidad de archivo para crear los archivos.
A menos que siempre cargue todos los archivos del archivo, TAR / GZ podría no ser una muy buena idea, porque no puede extraer archivos específicos ya que los necesita. Esta es la razón por la que muchos juegos usan archivos ZIP, que te permiten extraer archivos individuales según sea necesario (un buen ejemplo es Quake 3, cuyos archivos PK3 no son más que archivos ZIP con una extensión diferente).
EDITAR: "Ocultar" la estructura de carpetas del juego y "Guardar" solo los ejecutables
EDITAR: Gamedev Tuts Plus tiene un buen recurso
EDITAR: libarchive
Una posible solución libarchive, que es una biblioteca de archivo que se encargará de extraer archivos de un archivo como un archivo ZIP. Incluso le permite asignar el archivo extraído a un puntero de ARCHIVO estándar, lo que haría la interfaz con cualquier otra biblioteca potencialmente más sencilla.
EDITAR: archivos de formato ZIP con extensión alternativa
Aquí, me gusta el comentario de @Joachim Sauer
fuente
.tar
por ejemplo). Tiene que ver con la forma en que los datos se almacenan físicamente en el disco.Otra solución utilizada a menudo para "ocultar" los archivos del juego es la estructura de carpetas. Guarde solo sus ejecutables y tal vez un archivo Léame en el directorio principal y mueva los archivos del juego a una subcarpeta "datos". No creo que sea muy raro hacerlo. Muchos juegos que conozco almacenan su contenido de esa manera.
fuente
Realmente me gusta PhysFS para esto. Le permite acceder a carpetas o archivos zip con el mismo código. Funciona bien para todas las etapas de la vida de un juego.
actualizar:
Utilicé el tutorial incluido con la fuente y la documentación de doxygen para aprender PhysFS. La API realmente es bastante simple, pasará más tiempo aprendiendo cómo cargar imágenes en SFML a través de buffers de memoria en lugar de por ruta de archivo.
fuente
Sugeriría usar un archivo ZIP. Es un formato omnipresente y encontrará bibliotecas listas para usar que le permiten cargar archivos desde un archivo ZIP. Una búsqueda rápida en Google incluso reveló un cargador zip para sfml .
fuente
Bueno, podrías hacer trampa como lo mencionaron :) Puedes hacer una hoja de sprite a partir de las imágenes, no hay necesidad de comprimirla hoy en día a menos que ahorre una tonelada de espacio. Después de crear una hoja de sprites o varias hojas de sprites a partir de las imágenes, simplemente puede cambiar el nombre de sus extensiones. La mayoría de los jugadores no se molestarán en comprobar y ¿por qué no dejar esa opción a los artistas que quieran modificar tu juego en el futuro? De esa manera, también pueden crear una hoja de sprite, cambiar el nombre de su extensión y comenzar a rodar.
Con los archivos de texto, sugeriría humildemente que convierta esos datos en forma binaria. Estoy bastante seguro de que encontrará una manera simple de hacerlo. Por ejemplo, si solo usa AZ, az y 0-9, puede usar 6 bits para representar cada carácter, lo que de alguna manera protegerá su material protegido por derechos de autor. también evitará que otros editen mapas. Siempre puede agregar un convertidor de mapas si lo desea. Sin embargo, la compresión es completamente razonable para el texto.
fuente
No se trata solo de la cantidad de recursos o espacio en disco.
Con una gran cantidad de archivos de textura diferentes, ya que está utilizando SFML, que se procesa con OpenGL, cada vez que va a representar una textura, OpenGL necesita vincular la siguiente textura a la tarjeta de video (marque glBindTexture ()), y es Una tarea realmente costosa.
Con eso en mente, puedes darte cuenta de por qué los juegos generalmente ponen una serie de sprites en la misma textura, las llamadas hojas de sprites, de acuerdo con tus menús / niveles / mapas del juego.
El resultado es una gran ganancia en rendimiento, ya que está renderizando muchos sprites con la misma llamada de textura de enlace.
fuente
Personalmente, me dirigiría a la ruta del archivo binario personalizado para esto. Esto es algo que hago todo el tiempo ahora mismo, no es tan difícil como podría parecer, y también proporciona un nivel de ofuscación para los archivos de recursos del juego. Escribí un pequeño artículo introductorio de Gamedev sobre esto no hace mucho tiempo si estás interesado:
http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/
Las hojas de sprites son un tema completamente diferente, pero son la norma para la mayoría de los juegos :)
fuente
Otro método que puedes usar:
La versión gratuita de XnView proporciona una función llamada "
Strip of Images
" (SHIFT + A), que le permite crearsprite-collections
.Esto minimiza el acceso a los archivos y es particularmente importante para las aplicaciones web / juegos para minimizar el número de
HTTP-roundtrips
.El acceso a imágenes individuales se concede a través de mapas de coordenadas (por ejemplo, definiciones css).
fuente
Primero debe escribir toda su propia imagen / sonido / etc. cargar rutinas que utilizan una API personalizada para acceder a los datos archivados. Otro inconveniente es que, en primer lugar, debe escribir su propia utilidad de archivo para crear los archivos. A menos que siempre cargue todos los archivos del archivo, TAR / GZ podría no ser una muy buena idea, porque no puede extraer archivos específicos ya que los necesita. Esta es la razón por la que muchos juegos usan archivos ZIP, que le permiten extraer archivos individuales según sea necesario (un buen ejemplo es Quake 3, cuyos archivos PK3 no son más que archivos ZIP con una extensión diferente). http://zpp-library.sourceforge.net/
fuente