O que é PhysicsFS
PhysicsFS (Physics File System) ou physfs, fornece uma camada de abstração do sistema de arquivos do sistema operacional.
Motivação
Quando estava escrevendo a wintermoon estudei varias engines dentre elas a Ogre e a Irrlicht cada uma possui seu próprio sistema de arquivo virtual como descrito acima. mais porque a PhysicsFS? bom além de ser considerada muito segura e portável, ela tem um wrapper para a estrutura SDL_RWops o que facilita muito para projetos usando a biblioteca SDL. Outro ponto forte é a segurança, sua aplicação apenas poderá acessar os diretórios que você escolher, ideal para projetos baseados em scripts.
Recursos
Formatos suportados
- grp - groupfiles ou seja vários arquivos em um só sem compressão
- hog - maiores informações em href=”http://www.descent2.com/ddn/specs/hog
- lzma - formato popular usado pelo 7z
- mvl - Descent II Movielib, mais informações em http://www.descent2.com/ddn/specs/mvl/
- qpak - formato de arquivo usado no Quake 1, Quake 2 e Quake 3
- wad - usado na engine do DOOM
- zip - formato popular e muito usado
Extras
- selfextract - suporta autoextração do executável
- ignorecase - torna não case-sensitive (não diferencia maiúsculo de minusculo)
- wildcard - mascara ex. arquivo.*, *.zip, arqui??.*, *.zi?
- physfsrwops - abstração da estrutura SDL_RWops (é o que vamos usar, será mais explicado adiante)
- physfshttpd - Possibilita enviar ou receber arquivos via http
Alem de varias outras coisas, como bind para ruby e .net.
Velocidade
Como sabemos o acesso ao disco rígido é muito lento, usando um sistema de arquivos virtuais, reduzimos o acesso ao disco conseguindo um ganho de velocidade no carregamento.
Compilando
Se você usa algum Unix* (*BSD, GNU/Linux, etc) execute os comandos a seguir em algum terminal
cmake . && make && make install
No windows, baixe o cmake ou criar seu próprio projeto na sua IDE preferida.
Como o Skhaz é um bom menino ele já criou um projeto para o CodeBlocks/mingw32 bem limpo suportando apenas os formatos grp, lzma e zip, se alguem precisar de algum outro formato e não souber adicionar, mande me um email. Não foi adicionado nenhum arquivo da pasta extra, para manter compatibilidade (tive dificuldades em compilar a wintermoon em outras plataformas além do codeblocks/mingw32) caso você queira alguma facilidade da pasta extra, adicione o arquivo ao seu projeto, como explicado adiante.
SDL e PhysicsFS
A SDL é muito robusta e flexível, possibilitando “sobre escrever” as chamadas de open, read, write e close da estrutura SDL_RWops.
No diretório extras você encontra physfsrwops.c e physfsrwops.h, adicione eles ao seu projeto.
Abaixo segue um exemplo de como usar a physfs, antes de mais nada é preciso inicializar a physfs assim como a SDL
int main(int argc, char** argv)
{
if (PHYSFS_init(argv[0]) == 0)
{
fprintf(stderr, "%s\n", PHYSFS_getLastError());
exit(-1);
}
// ...
PHYSFS_init recebe um único parâmetro, em algumas plataformas pode ser NULL, mais por questões de portabilidade aconselho sempre usa-lo.
e também é necessário desnicializar
PHYSFS_deinit();
Adicionando alguns diretórios e arquivos
// adiciona o diretório media para a "pesquisa"
PHYSFS_addToSearchPath("media/", true);
// adiciona o arquivo jogador.zip
PHYSFS_addToSearchPath("jogador.zip", true);
// PHYSFSRWOPS_openRead se encontra no arquivo physfsrwops.c
// basicamente ela retorna uma estrutura SDL_RWops
// jogador_1.png esta dentro de jogador.zip
SDL_RWops* rwops = PHYSFSRWOPS_openRead("jogador1.png");
// O segundo parâmetro diz a IMG_Load_RW que
// libere o recurso após carrega-lo
SDL_Surface* surface = IMG_Load_RW(rwops, 1);
// Pronto já temos nossa imagem carregada.
Listando os arquivos
char **rc = PHYSFS_enumerateFiles("/");
char **i;
for (i = rc; *i != NULL; i++)
printf("%s\n", *i);
PHYSFS_freeList(rc);
Onde
Voce pode baixar o source e compilar manualmente, para quem usa algum Unix Like, rode o comando cmake . && make && make install
- Site oficial da PhysicsFS (http://icculus.org/physfs/)
- 7zip (http://www.7-zip.org/)
- PhysicsFS já com projeto, fontes e compilada (arquivo não recuperado)
- Exemplo completo (arquivo não recuperado)
Dica
PhysicsFS com mensagens em Português do Brasil: Adicione essa macro PHYSFS_LANG_PORTUGUESE_BR” sem aspas, ou então altere-a no arquivo physfs_internal.h na linha 78
Referencias
ParaGUI (http://www.paragui.org/)
Irrlicht (http://irrlicht.sourceforge.net/)
Ogre (http://www.ogre3d.org/)
Não deixem de comentar, criticas, sugestões e elogios são muito bem vindos.
Muito bom artigo, vai me ajudar muito em futuros desenvolvimentos.
:blink: Muito bom !
Eu tinha problemas para listar arquivos do diretório em meus jogos, apesar da SDL ser portável o sistema de arquivos não é.
Aproveito e resolvo também o problema dos arquivos soltos com o .grp
Vlw pela dica !
Ótimo artigo! Vai me ajudar bastante, também, em meus projetos! =~
:ph34r: <- parece um ninja :D
Nunca usei o SDL_RWops, esse artigo me ajudou a intender um pouco sobre o funcionamento dele, vlw skhaz :biggrin: