Acabei de terminar um jogo básico de RPG escrito em C ++ SFML, dediquei muito esforço ao jogo e gostaria de distribuí-lo, no entanto, encontrei um pequeno problema.
O problema é que tenho mais de 200 imagens e arquivos de mapeamento (são arquivos .txt que contêm códigos de mapa), todos na mesma pasta que o executável. Quando olho para a pasta, me dá vontade de chorar um pouco vendo tantos recursos, nunca vi um jogo que mostre todos os recursos diretamente; acredito que eles empacotam os recursos em um determinado arquivo.
Bem, é isso que estou tentando alcançar: espero compactar todas as imagens em um arquivo (talvez também os arquivos .txt) e poder ler esse arquivo ou adicioná-lo facilmente.
c++
assets
sfml
spritesheet
Bugster
fonte
fonte
Respostas:
Os programadores de jogos contam com um dos dois métodos principais de armazenamento de dados:
A desvantagem da primeira solução é o problema de espaço em disco desperdiçado, bem como o problema de instalações mais lentas.
A segunda solução fornece suas próprias armadilhas, primeiro é que você deve escrever toda a sua própria imagem / som / etc. rotinas de carregamento que usam uma API personalizada para acessar os dados arquivados. Uma desvantagem adicional é que você precisa escrever seu próprio utilitário de arquivamento para criar os arquivos em primeiro lugar.
A menos que você sempre carregue todos os arquivos do arquivo morto, o TAR / GZ pode não ser uma boa idéia, porque você não pode extrair arquivos específicos conforme necessário. Essa é a razão pela qual muitos jogos usam arquivos ZIP, que permitem extrair arquivos individuais conforme necessário (um bom exemplo é o Quake 3, cujos arquivos PK3 nada mais são do que arquivos ZIP com uma extensão diferente).
EDIT: "Ocultar" a estrutura de pastas do jogo e "Manter" apenas os executáveis
EDIT: Gamedev Tuts Plus tem um bom recurso
EDIT: libarchive
Uma solução potencial libarchive, que é uma biblioteca de arquivamento que manipula a extração de arquivos de um archive, como um arquivo ZIP. Ele ainda permite atribuir o arquivo extraído a um ponteiro FILE padrão, o que tornaria a interface com outras bibliotecas potencialmente mais direta.
EDIT: arquivos em formato ZIP com extensão alternativa
Aqui, eu gosto do comentário de @Joachim Sauer
fonte
.tar
por exemplo). Tem a ver com a maneira como os dados são fisicamente armazenados no disco.Outra solução frequentemente usada para "ocultar" os arquivos do jogo é a estrutura de pastas. Mantenha apenas seus executáveis e talvez um leia-me no diretório principal e mova os arquivos do jogo para uma subpasta "data". Não acho que seja muito incomum fazê-lo. Conheço muitos jogos que armazenam seu conteúdo dessa maneira.
fonte
Eu realmente gosto do PhysFS por isso. Permite acessar pastas ou arquivos zip com o mesmo código. Funciona bem em todas as etapas da vida dos jogos.
atualizar:
Usei o tutorial incluído com a fonte e a documentação doxygen para aprender o PhysFS. A API é realmente bastante simples, você gastará mais tempo aprendendo a carregar imagens no SFML por meio de buffers de memória em vez de pelo caminho do arquivo.
fonte
Eu sugiro usar um arquivo ZIP. É um formato onipresente e você encontrará bibliotecas prontas que permitem carregar arquivos de dentro de um arquivo ZIP. Uma rápida pesquisa no Google revelou até um zip loader para sfml .
fonte
Bem, você pode trapacear como eles mencionaram :) Você pode fazer uma folha de sprite a partir das imagens, não há necessidade de compactá-la hoje em dia, a menos que economize muito espaço. Depois de criar uma folha de sprite ou várias folhas de sprite a partir das imagens, você pode simplesmente renomear suas extensões. A maioria dos jogadores não se preocupa em verificar e por que não deixar essa opção para os artistas que desejam modificar seu jogo no futuro? Dessa forma, eles também podem criar uma folha de sprite, renomear sua extensão e começar a rolar.
Com os arquivos de texto, sugiro humildemente que você converta esses dados em formato binário. Tenho certeza de que você encontrará uma maneira simples de fazer isso. Por exemplo, se você usar apenas AZ, az e 0-9, poderá usar 6 bits para representar cada caractere, o que protegerá um pouco o seu material protegido por direitos autorais. também impedirá que outras pessoas editem mapas. Você sempre pode adicionar um conversor de mapas, se quiser. O zíper é completamente razoável para o texto.
fonte
Não se trata apenas do número de recursos ou espaço em disco.
Com vários arquivos de textura diferentes, enquanto você usa o SFML, que é renderizado com o OpenGL, toda vez que você renderiza uma textura, o OpenGL precisa vincular a próxima textura à placa de vídeo (verifique glBindTexture ()) e é uma tarefa muito cara.
Com isso em mente, você pode entender por que os jogos geralmente colocam vários sprites na mesma textura, as chamadas planilhas, de acordo com seus menus / níveis / mapas do jogo.
O resultado é um enorme ganho de desempenho, pois você está processando muitos sprites com a mesma chamada de textura de ligação.
fonte
Eu pessoalmente diria a rota do arquivo binário personalizado para isso. Isso é algo que eu faço o tempo todo agora, não é tão difícil quanto pode parecer e também fornece um nível de ofuscação para os arquivos de recursos do jogo. Escrevi um pequeno artigo introdutório sobre Gamedev sobre isso há pouco tempo, se você estiver interessado:
http://gamedev.tutsplus.com/tutorials/implementation/create-custom-binary-file-formats-for-your-games-data/
As folhas de sprite são um assunto completamente diferente, mas são a norma para a maioria dos jogos :)
fonte
Outro método que você pode usar:
A versão gratuita do XnView fornece um recurso chamado "
Strip of Images
" (SHIFT + A), que permite criarsprite-collections
.Isso minimiza o acesso a arquivos e é particularmente importante para aplicativos / jogos da web para minimizar o número de
HTTP-roundtrips
.O acesso a imagens individuais é concedido através de mapas de coordenadas (por exemplo, css-definition).
fonte
Primeiro você deve escrever sua própria imagem / som / etc. rotinas de carregamento que usam uma API personalizada para acessar os dados arquivados. Uma desvantagem adicional é que você precisa escrever seu próprio utilitário de arquivamento para criar os arquivos em primeiro lugar. A menos que você sempre carregue todos os arquivos do arquivo morto, o TAR / GZ pode não ser uma boa idéia, porque você não pode extrair arquivos específicos conforme necessário. Essa é a razão pela qual muitos jogos usam arquivos ZIP, que permitem extrair arquivos individuais conforme necessário (um bom exemplo é o Quake 3, cujos arquivos PK3 nada mais são do que arquivos ZIP com uma extensão diferente). http://zpp-library.sourceforge.net/
fonte