C++ · SDL

Sistema de Arquivo Virtual usando a PhysicsFS

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

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

C++
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

C++
PHYSFS_deinit();

Adicionando alguns diretórios e arquivos

C++
// adiciona o diretório media para a "pesquisa"
PHYSFS_addToSearchPath("media/", true);

// adiciona o arquivo jogador.zip
PHYSFS_addToSearchPath("jogador.zip", true);
C++
// 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

C++
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

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.

Fonte arquivística

Conteúdo recuperado via Wayback Machine, captura 20080519004802.

Abrir registro original ↗

Discussão preservada

4 comentários

  1. DarkSasori

    Muito bom artigo, vai me ajudar muito em futuros desenvolvimentos.

  2. Diogo_RBG

    :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 !

  3. Todi

    Ótimo artigo! Vai me ajudar bastante, também, em meus projetos! =~

  4. Fernando Tonon

    :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: