AWESOME ENGINE / GUÍA TÉCNICA

Recursos y persistencia

Carga de texturas, sonidos, fuentes y música; guardado JSON y capturas del motor.

En esta página

Dónde busca los archivos

ResourceManager resuelve los nombres dentro de directorios concretos. Entrega un nombre de archivo relativo a la categoría correspondiente, no la ruta completa desde la raíz.

API Directorio 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>

Las rutas son relativas al directorio de trabajo de la aplicación. Por eso debes ejecutar desde la raíz del repositorio, donde existe Content.

Cómo funciona la caché

Texturas, buffers de sonido y fuentes se guardan en mapas indexados por nombre de archivo. Una solicitud posterior consulta la entrada existente. La siguiente función procede del código de referencia:

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);
}

El manager conserva la propiedad de esos objetos. Los consumidores no deben eliminar los punteros que reciben. Tampoco existe una operación pública de descarga, invalidación de caché o recarga automática.

Comprueba el resultado antes de usarlo: la primera carga fallida devuelve nullptr. La implementación inserta la entrada antes de intentar cargar, así que una solicitud posterior del mismo nombre no vuelve a intentarlo automáticamente. Corregir un archivo ausente suele requerir reiniciar la aplicación con la implementación actual.

Música y sonido

Los sonidos cortos utilizan sf::SoundBuffer cacheados. El juego crea y mantiene sus fuentes sf::Sound mientras usa esos buffers.

FetchMusic abre un archivo en un objeto sf::Music y lo devuelve dentro de un optional; si no puede abrirlo, devuelve std::nullopt. La música no se conserva en la caché de ResourceManager: la escena mantiene el objeto recibido y controla su reproducción.

No todas las cargas del proyecto pasan por el manager. El fondo de RenderManager, los shaders y ciertos recursos del núcleo se abren directamente desde sus clases.

Guardado JSON

SaveManager lee Content/Save.json al construirse; si el archivo no existe, comienza con un objeto vacío. Su interfaz ofrece Set, Get, Has, Erase y Clear.

Al destruirse, escribe los valores si el objeto no está vacío. Esto sirve para persistir datos simples del juego, pero no es un sistema transaccional ni de guardado en la nube.

Dos límites que conviene conocer:

  • Un JSON existente pero inválido no tiene recuperación general implementada.
  • Clear() vacía los valores en memoria, pero el destructor no sobrescribe el archivo cuando el objeto queda vacío. No equivale necesariamente a borrar el guardado en disco.

Para probar cambios en persistencia, conserva una copia de tus datos antes de modificar el archivo.

Capturas de pantalla

F12 invoca ScreenshotManager::Take. El manager copia la ventana a una textura, obtiene la imagen y guarda un PNG en Content/Screenshots, creando el directorio si hace falta.

El nombre contiene la fecha y la hora con milisegundos. Se registra el resultado y se reproduce un sonido cuando se guarda correctamente. La aplicación necesita permisos de escritura en ese directorio.

Fuentes

Basado en código fuente verificado.¿Encontraste un problema? →