AWESOME ENGINE / GUIA TÉCNICO

Recursos e persistência

Carregamento de texturas, sons, fontes e música; salvamento em JSON e capturas do motor.

Nesta página

Onde os arquivos são procurados

O ResourceManager resolve nomes dentro de diretórios específicos. Forneça um nome de arquivo relativo à categoria correspondente, não o caminho completo a partir da raiz.

API Diretório Resultado
FetchTexture(filename) Content/Textures/ sf::Texture*
FetchSound(filename) Content/Sounds/ sf::SoundBuffer*
FetchFont(filename) Content/Fonts/ sf::Font*
FetchMusic(filename) Content/Musics/ std::optional<sf::Music>

Os caminhos são relativos ao diretório de trabalho do aplicativo. Por isso, você deve executar a partir da raiz do repositório, onde existe Content.

Como o cache funciona

Texturas, buffers de som e fontes são armazenados em mapas indexados pelo nome do arquivo. Uma solicitação posterior consulta a entrada existente. A função abaixo vem do código de referência:

sf::Texture *ResourceManager::FetchTexture(const std::string &filename) {
  if (!textures_.contains(filename)) {
    if (!textures_[filename].loadFromFile("Content/Textures/" + filename)) {
      LOG_ERROR("Failed to load texture: {}", filename);
      return nullptr;
    }
  }

  return &textures_.at(filename);
}

O manager mantém a propriedade desses objetos. Os consumidores não devem excluir os ponteiros que recebem. Também não existe uma operação pública para descarregar recursos, invalidar o cache ou recarregar automaticamente.

Verifique o resultado antes de usá-lo: a primeira carga malsucedida retorna nullptr. A implementação insere a entrada antes de tentar carregar, então uma solicitação posterior do mesmo nome não tenta novamente de forma automática. Corrigir um arquivo ausente normalmente exige reiniciar o aplicativo com a implementação atual.

Música e som

Sons curtos usam objetos sf::SoundBuffer em cache. O jogo cria e mantém suas fontes sf::Sound enquanto usa esses buffers.

FetchMusic abre um arquivo em um objeto sf::Music e o retorna dentro de um optional; se não conseguir abrir, retorna std::nullopt. A música não é mantida no cache do ResourceManager: a cena mantém o objeto recebido e controla sua reprodução.

Nem todos os carregamentos do projeto passam pelo manager. O fundo do RenderManager, os shaders e determinados recursos do núcleo são abertos diretamente por suas classes.

Salvamento em JSON

O SaveManager lê Content/Save.json ao ser construído; se o arquivo não existir, começa com um objeto vazio. Sua interface oferece Set, Get, Has, Erase e Clear.

Ao ser destruído, grava os valores se o objeto não estiver vazio. Isso permite persistir dados simples do jogo, mas não é um sistema transacional nem de salvamento na nuvem.

Duas limitações que vale conhecer:

  • Um JSON existente, mas inválido, não tem recuperação geral implementada.
  • Clear() esvazia os valores na memória, mas o destrutor não sobrescreve o arquivo quando o objeto fica vazio. Isso não equivale necessariamente a apagar os dados salvos em disco.

Para testar alterações na persistência, mantenha uma cópia dos seus dados antes de modificar o arquivo.

Capturas de tela

F12 chama ScreenshotManager::Take. O manager copia a janela para uma textura, obtém a imagem e salva um PNG em Content/Screenshots, criando o diretório se necessário.

O nome contém a data e a hora com milissegundos. O resultado é registrado, e um som é reproduzido quando o salvamento é concluído com sucesso. O aplicativo precisa de permissão de escrita nesse diretório.

Fontes

Baseado em código-fonte verificado.Encontrou um problema? →