singletoning

This commit is contained in:
2025-02-21 18:03:09 +01:00
parent debcc3409e
commit 5f68c6256f
8 changed files with 601 additions and 563 deletions

View File

@@ -4,25 +4,38 @@
#include <stddef.h> // Para size_t
#include <iostream> // Para basic_ostream, operator<<, cout, endl
// Constructor
Asset::Asset(std::string executablePath)
// [SINGLETON] Hay que definir las variables estáticas, desde el .h sólo la hemos declarado
Asset *Asset::asset_ = nullptr;
// [SINGLETON] Crearemos el objeto con esta función estática
void Asset::init(const std::string &executable_path)
{
this->executablePath = executablePath.substr(0, executablePath.find_last_of("\\/"));
longestName = 0;
verbose = true;
Asset::asset_ = new Asset(executable_path);
}
// [SINGLETON] Destruiremos el objeto con esta función estática
void Asset::destroy()
{
delete Asset::asset_;
}
// [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él
Asset *Asset::get()
{
return Asset::asset_;
}
// Añade un elemento a la lista
void Asset::add(std::string file, enum assetType type, bool required, bool absolute)
{
item_t temp;
temp.file = absolute ? file : executablePath + file;
temp.file = absolute ? file : executable_path_ + file;
temp.type = type;
temp.required = required;
fileList.push_back(temp);
const std::string filename = file.substr(file.find_last_of("\\/") + 1);
longestName = SDL_max(longestName, filename.size());
longest_name_ = SDL_max(longest_name_, filename.size());
}
// Devuelve el fichero de un elemento de la lista a partir de una cadena
@@ -39,7 +52,7 @@ std::string Asset::get(std::string text)
}
}
if (verbose)
if (verbose_)
{
std::cout << "Warning: file " << text.c_str() << " not found" << std::endl;
}
@@ -51,11 +64,11 @@ bool Asset::check()
{
bool success = true;
if (verbose)
if (verbose_)
{
std::cout << "\n** Checking files" << std::endl;
std::cout << "Executable path is: " << executablePath << std::endl;
std::cout << "Executable path is: " << executable_path_ << std::endl;
std::cout << "Sample filepath: " << fileList.back().file << std::endl;
}
@@ -76,7 +89,7 @@ bool Asset::check()
// Si hay ficheros de ese tipo, comprueba si existen
if (any)
{
if (verbose)
if (verbose_)
{
std::cout << "\n>> " << getTypeName(type).c_str() << " FILES" << std::endl;
}
@@ -92,7 +105,7 @@ bool Asset::check()
}
// Resultado
if (verbose)
if (verbose_)
{
if (success)
{
@@ -126,11 +139,11 @@ bool Asset::checkFile(std::string path)
SDL_RWclose(file);
}
if (verbose)
if (verbose_)
{
std::cout.setf(std::ios::left, std::ios::adjustfield);
std::cout << "Checking file: ";
std::cout.width(longestName + 2);
std::cout.width(longest_name_ + 2);
std::cout.fill('.');
std::cout << filename + " ";
std::cout << " [" + result + "]" << std::endl;
@@ -189,5 +202,5 @@ std::string Asset::getTypeName(int type)
// Establece si ha de mostrar texto por pantalla
void Asset::setVerbose(bool value)
{
verbose = value;
verbose_ = value;
}

View File

@@ -2,6 +2,7 @@
#include <string> // Para string
#include <vector> // Para vector
#include "utils.h"
enum assetType
{
@@ -21,20 +22,22 @@ enum assetType
class Asset
{
private:
// [SINGLETON] Objeto asset privado
static Asset *asset_;
// Estructura para definir un item
struct item_t
{
std::string file; // Ruta del fichero desde la raiz del directorio
enum assetType type; // Indica el tipo de recurso
bool required; // Indica si es un fichero que debe de existir
// bool absolute; // Indica si la ruta que se ha proporcionado es una ruta absoluta
};
// Variables
int longestName; // Contiene la longitud del nombre de fichero mas largo
int longest_name_ = 0; // Contiene la longitud del nombre de fichero mas largo
std::vector<item_t> fileList; // Listado con todas las rutas a los ficheros
std::string executablePath; // Ruta al ejecutable
bool verbose; // Indica si ha de mostrar información por pantalla
std::string executable_path_; // Ruta al ejecutable
bool verbose_ = true; // Indica si ha de mostrar información por pantalla
// Comprueba que existe un fichero
bool checkFile(std::string executablePath);
@@ -42,9 +45,22 @@ private:
// Devuelve el nombre del tipo de recurso
std::string getTypeName(int type);
public:
// Constructor
Asset(std::string path);
explicit Asset(const std::string &executable_path)
: executable_path_(getPath(executable_path)) {}
// Destructor
~Asset() = default;
public:
// [SINGLETON] Crearemos el objeto con esta función estática
static void init(const std::string &executable_path);
// [SINGLETON] Destruiremos el objeto con esta función estática
static void destroy();
// [SINGLETON] Con este método obtenemos el objeto y podemos trabajar con él
static Asset *get();
// Añade un elemento a la lista
void add(std::string file, enum assetType type, bool required = true, bool absolute = false);

View File

@@ -53,6 +53,7 @@ Director::Director(int argc, const char *argv[])
#ifdef DEBUG
section->name = SECTION_TITLE;
#endif
Asset::init(argv[0]); // Crea el objeto que controla los ficheros de recursos
// Crea e inicializa las opciones del programa
initOptions();
@@ -69,8 +70,7 @@ Director::Director(int argc, const char *argv[])
#endif
// Crea el objeto que controla los ficheros de recursos
asset = new Asset(executablePath);
asset->setVerbose(options->console);
Asset::get()->setVerbose(options->console);
// Si falta algún fichero no inicia el programa
if (!setFileList())
@@ -88,13 +88,13 @@ Director::Director(int argc, const char *argv[])
initJailAudio();
// Crea los objetos
resource = new Resource(renderer, asset, options);
input = new Input(asset->get("gamecontrollerdb.txt"));
resource = new Resource(renderer, Asset::get(), options);
input = new Input(Asset::get()->get("gamecontrollerdb.txt"));
initInput();
screen = new Screen(window, renderer, asset, options);
screen = new Screen(window, renderer, Asset::get(), options);
screen->setBorderColor(borderColor);
debug = new Debug(renderer, screen, asset);
music = JA_LoadMusic(asset->get("title.ogg").c_str());
debug = new Debug(renderer, screen, Asset::get());
music = JA_LoadMusic(Asset::get()->get("title.ogg").c_str());
}
Director::~Director()
@@ -105,7 +105,6 @@ Director::~Director()
// Libera la memoria
delete section;
delete options;
delete asset;
delete input;
delete screen;
delete debug;
@@ -217,7 +216,7 @@ bool Director::loadConfig()
// Variables para manejar el fichero
std::string line;
std::ifstream file(asset->get("config.txt"));
std::ifstream file(Asset::get()->get("config.txt"));
// Si el fichero se puede abrir
if (file.good())
@@ -305,20 +304,20 @@ bool Director::saveConfig()
bool success = true;
// Crea y abre el fichero de texto
std::ofstream file(asset->get("config.txt"));
std::ofstream file(Asset::get()->get("config.txt"));
if (file.good())
{
if (options->console)
{
std::cout << asset->get("config.txt") << " open for writing" << std::endl;
std::cout << Asset::get()->get("config.txt") << " open for writing" << std::endl;
}
}
else
{
if (options->console)
{
std::cout << asset->get("config.txt") << " can't be opened" << std::endl;
std::cout << Asset::get()->get("config.txt") << " can't be opened" << std::endl;
}
}
@@ -1367,354 +1366,354 @@ bool Director::setFileList()
#endif
// Texto
asset->add(prefix + "/data/font/smb2.png", t_font);
asset->add(prefix + "/data/font/smb2.txt", t_font);
asset->add(prefix + "/data/font/debug.png", t_font);
asset->add(prefix + "/data/font/debug.txt", t_font);
asset->add(prefix + "/data/font/gauntlet.png", t_font);
asset->add(prefix + "/data/font/gauntlet.txt", t_font);
asset->add(prefix + "/data/font/subatomic.png", t_font);
asset->add(prefix + "/data/font/subatomic.txt", t_font);
Asset::get()->add(prefix + "/data/font/smb2.png", t_font);
Asset::get()->add(prefix + "/data/font/smb2.txt", t_font);
Asset::get()->add(prefix + "/data/font/debug.png", t_font);
Asset::get()->add(prefix + "/data/font/debug.txt", t_font);
Asset::get()->add(prefix + "/data/font/gauntlet.png", t_font);
Asset::get()->add(prefix + "/data/font/gauntlet.txt", t_font);
Asset::get()->add(prefix + "/data/font/subatomic.png", t_font);
Asset::get()->add(prefix + "/data/font/subatomic.txt", t_font);
// Shaders
asset->add(prefix + "/data/shaders/crtpi_192.glsl", t_data);
asset->add(prefix + "/data/shaders/crtpi_240.glsl", t_data);
Asset::get()->add(prefix + "/data/shaders/crtpi_192.glsl", t_data);
Asset::get()->add(prefix + "/data/shaders/crtpi_240.glsl", t_data);
// Datos
asset->add(prefix + "/data/input/gamecontrollerdb.txt", t_data);
Asset::get()->add(prefix + "/data/input/gamecontrollerdb.txt", t_data);
// Ficheros de sistema
asset->add(systemFolder + "/config.txt", t_data, false, true);
asset->add(systemFolder + "/stats_buffer.csv", t_data, false, true);
asset->add(systemFolder + "/stats.csv", t_data, false, true);
asset->add(systemFolder + "/cheevos.bin", t_data, false, true);
Asset::get()->add(systemFolder + "/config.txt", t_data, false, true);
Asset::get()->add(systemFolder + "/stats_buffer.csv", t_data, false, true);
Asset::get()->add(systemFolder + "/stats.csv", t_data, false, true);
Asset::get()->add(systemFolder + "/cheevos.bin", t_data, false, true);
// Notificaciones
asset->add(prefix + "/data/notifications/notify.png", t_bitmap);
Asset::get()->add(prefix + "/data/notifications/notify.png", t_bitmap);
// Habitaciones
asset->add(prefix + "/data/room/01.room", t_room);
asset->add(prefix + "/data/room/02.room", t_room);
asset->add(prefix + "/data/room/03.room", t_room);
asset->add(prefix + "/data/room/04.room", t_room);
asset->add(prefix + "/data/room/05.room", t_room);
asset->add(prefix + "/data/room/06.room", t_room);
asset->add(prefix + "/data/room/07.room", t_room);
asset->add(prefix + "/data/room/08.room", t_room);
asset->add(prefix + "/data/room/09.room", t_room);
asset->add(prefix + "/data/room/10.room", t_room);
asset->add(prefix + "/data/room/11.room", t_room);
asset->add(prefix + "/data/room/12.room", t_room);
asset->add(prefix + "/data/room/13.room", t_room);
asset->add(prefix + "/data/room/14.room", t_room);
asset->add(prefix + "/data/room/15.room", t_room);
asset->add(prefix + "/data/room/16.room", t_room);
asset->add(prefix + "/data/room/17.room", t_room);
asset->add(prefix + "/data/room/18.room", t_room);
asset->add(prefix + "/data/room/19.room", t_room);
asset->add(prefix + "/data/room/20.room", t_room);
asset->add(prefix + "/data/room/21.room", t_room);
asset->add(prefix + "/data/room/22.room", t_room);
asset->add(prefix + "/data/room/23.room", t_room);
asset->add(prefix + "/data/room/24.room", t_room);
asset->add(prefix + "/data/room/25.room", t_room);
asset->add(prefix + "/data/room/26.room", t_room);
asset->add(prefix + "/data/room/27.room", t_room);
asset->add(prefix + "/data/room/28.room", t_room);
asset->add(prefix + "/data/room/29.room", t_room);
asset->add(prefix + "/data/room/30.room", t_room);
asset->add(prefix + "/data/room/31.room", t_room);
asset->add(prefix + "/data/room/32.room", t_room);
asset->add(prefix + "/data/room/33.room", t_room);
asset->add(prefix + "/data/room/34.room", t_room);
asset->add(prefix + "/data/room/35.room", t_room);
asset->add(prefix + "/data/room/36.room", t_room);
asset->add(prefix + "/data/room/37.room", t_room);
asset->add(prefix + "/data/room/38.room", t_room);
asset->add(prefix + "/data/room/39.room", t_room);
asset->add(prefix + "/data/room/40.room", t_room);
asset->add(prefix + "/data/room/41.room", t_room);
asset->add(prefix + "/data/room/42.room", t_room);
asset->add(prefix + "/data/room/43.room", t_room);
asset->add(prefix + "/data/room/44.room", t_room);
asset->add(prefix + "/data/room/45.room", t_room);
asset->add(prefix + "/data/room/46.room", t_room);
asset->add(prefix + "/data/room/47.room", t_room);
asset->add(prefix + "/data/room/48.room", t_room);
asset->add(prefix + "/data/room/49.room", t_room);
asset->add(prefix + "/data/room/50.room", t_room);
asset->add(prefix + "/data/room/51.room", t_room);
asset->add(prefix + "/data/room/52.room", t_room);
asset->add(prefix + "/data/room/53.room", t_room);
asset->add(prefix + "/data/room/54.room", t_room);
asset->add(prefix + "/data/room/55.room", t_room);
asset->add(prefix + "/data/room/56.room", t_room);
asset->add(prefix + "/data/room/57.room", t_room);
asset->add(prefix + "/data/room/58.room", t_room);
asset->add(prefix + "/data/room/59.room", t_room);
asset->add(prefix + "/data/room/60.room", t_room);
Asset::get()->add(prefix + "/data/room/01.room", t_room);
Asset::get()->add(prefix + "/data/room/02.room", t_room);
Asset::get()->add(prefix + "/data/room/03.room", t_room);
Asset::get()->add(prefix + "/data/room/04.room", t_room);
Asset::get()->add(prefix + "/data/room/05.room", t_room);
Asset::get()->add(prefix + "/data/room/06.room", t_room);
Asset::get()->add(prefix + "/data/room/07.room", t_room);
Asset::get()->add(prefix + "/data/room/08.room", t_room);
Asset::get()->add(prefix + "/data/room/09.room", t_room);
Asset::get()->add(prefix + "/data/room/10.room", t_room);
Asset::get()->add(prefix + "/data/room/11.room", t_room);
Asset::get()->add(prefix + "/data/room/12.room", t_room);
Asset::get()->add(prefix + "/data/room/13.room", t_room);
Asset::get()->add(prefix + "/data/room/14.room", t_room);
Asset::get()->add(prefix + "/data/room/15.room", t_room);
Asset::get()->add(prefix + "/data/room/16.room", t_room);
Asset::get()->add(prefix + "/data/room/17.room", t_room);
Asset::get()->add(prefix + "/data/room/18.room", t_room);
Asset::get()->add(prefix + "/data/room/19.room", t_room);
Asset::get()->add(prefix + "/data/room/20.room", t_room);
Asset::get()->add(prefix + "/data/room/21.room", t_room);
Asset::get()->add(prefix + "/data/room/22.room", t_room);
Asset::get()->add(prefix + "/data/room/23.room", t_room);
Asset::get()->add(prefix + "/data/room/24.room", t_room);
Asset::get()->add(prefix + "/data/room/25.room", t_room);
Asset::get()->add(prefix + "/data/room/26.room", t_room);
Asset::get()->add(prefix + "/data/room/27.room", t_room);
Asset::get()->add(prefix + "/data/room/28.room", t_room);
Asset::get()->add(prefix + "/data/room/29.room", t_room);
Asset::get()->add(prefix + "/data/room/30.room", t_room);
Asset::get()->add(prefix + "/data/room/31.room", t_room);
Asset::get()->add(prefix + "/data/room/32.room", t_room);
Asset::get()->add(prefix + "/data/room/33.room", t_room);
Asset::get()->add(prefix + "/data/room/34.room", t_room);
Asset::get()->add(prefix + "/data/room/35.room", t_room);
Asset::get()->add(prefix + "/data/room/36.room", t_room);
Asset::get()->add(prefix + "/data/room/37.room", t_room);
Asset::get()->add(prefix + "/data/room/38.room", t_room);
Asset::get()->add(prefix + "/data/room/39.room", t_room);
Asset::get()->add(prefix + "/data/room/40.room", t_room);
Asset::get()->add(prefix + "/data/room/41.room", t_room);
Asset::get()->add(prefix + "/data/room/42.room", t_room);
Asset::get()->add(prefix + "/data/room/43.room", t_room);
Asset::get()->add(prefix + "/data/room/44.room", t_room);
Asset::get()->add(prefix + "/data/room/45.room", t_room);
Asset::get()->add(prefix + "/data/room/46.room", t_room);
Asset::get()->add(prefix + "/data/room/47.room", t_room);
Asset::get()->add(prefix + "/data/room/48.room", t_room);
Asset::get()->add(prefix + "/data/room/49.room", t_room);
Asset::get()->add(prefix + "/data/room/50.room", t_room);
Asset::get()->add(prefix + "/data/room/51.room", t_room);
Asset::get()->add(prefix + "/data/room/52.room", t_room);
Asset::get()->add(prefix + "/data/room/53.room", t_room);
Asset::get()->add(prefix + "/data/room/54.room", t_room);
Asset::get()->add(prefix + "/data/room/55.room", t_room);
Asset::get()->add(prefix + "/data/room/56.room", t_room);
Asset::get()->add(prefix + "/data/room/57.room", t_room);
Asset::get()->add(prefix + "/data/room/58.room", t_room);
Asset::get()->add(prefix + "/data/room/59.room", t_room);
Asset::get()->add(prefix + "/data/room/60.room", t_room);
// Tilemaps
asset->add(prefix + "/data/room/01.tmx", t_room);
asset->add(prefix + "/data/room/02.tmx", t_room);
asset->add(prefix + "/data/room/03.tmx", t_room);
asset->add(prefix + "/data/room/04.tmx", t_room);
asset->add(prefix + "/data/room/05.tmx", t_room);
asset->add(prefix + "/data/room/06.tmx", t_room);
asset->add(prefix + "/data/room/07.tmx", t_room);
asset->add(prefix + "/data/room/08.tmx", t_room);
asset->add(prefix + "/data/room/09.tmx", t_room);
asset->add(prefix + "/data/room/10.tmx", t_room);
asset->add(prefix + "/data/room/11.tmx", t_room);
asset->add(prefix + "/data/room/12.tmx", t_room);
asset->add(prefix + "/data/room/13.tmx", t_room);
asset->add(prefix + "/data/room/14.tmx", t_room);
asset->add(prefix + "/data/room/15.tmx", t_room);
asset->add(prefix + "/data/room/16.tmx", t_room);
asset->add(prefix + "/data/room/17.tmx", t_room);
asset->add(prefix + "/data/room/18.tmx", t_room);
asset->add(prefix + "/data/room/19.tmx", t_room);
asset->add(prefix + "/data/room/20.tmx", t_room);
asset->add(prefix + "/data/room/21.tmx", t_room);
asset->add(prefix + "/data/room/22.tmx", t_room);
asset->add(prefix + "/data/room/23.tmx", t_room);
asset->add(prefix + "/data/room/24.tmx", t_room);
asset->add(prefix + "/data/room/25.tmx", t_room);
asset->add(prefix + "/data/room/26.tmx", t_room);
asset->add(prefix + "/data/room/27.tmx", t_room);
asset->add(prefix + "/data/room/28.tmx", t_room);
asset->add(prefix + "/data/room/29.tmx", t_room);
asset->add(prefix + "/data/room/30.tmx", t_room);
asset->add(prefix + "/data/room/31.tmx", t_room);
asset->add(prefix + "/data/room/32.tmx", t_room);
asset->add(prefix + "/data/room/33.tmx", t_room);
asset->add(prefix + "/data/room/34.tmx", t_room);
asset->add(prefix + "/data/room/35.tmx", t_room);
asset->add(prefix + "/data/room/36.tmx", t_room);
asset->add(prefix + "/data/room/37.tmx", t_room);
asset->add(prefix + "/data/room/38.tmx", t_room);
asset->add(prefix + "/data/room/39.tmx", t_room);
asset->add(prefix + "/data/room/40.tmx", t_room);
asset->add(prefix + "/data/room/41.tmx", t_room);
asset->add(prefix + "/data/room/42.tmx", t_room);
asset->add(prefix + "/data/room/43.tmx", t_room);
asset->add(prefix + "/data/room/44.tmx", t_room);
asset->add(prefix + "/data/room/45.tmx", t_room);
asset->add(prefix + "/data/room/46.tmx", t_room);
asset->add(prefix + "/data/room/47.tmx", t_room);
asset->add(prefix + "/data/room/48.tmx", t_room);
asset->add(prefix + "/data/room/49.tmx", t_room);
asset->add(prefix + "/data/room/50.tmx", t_room);
asset->add(prefix + "/data/room/51.tmx", t_room);
asset->add(prefix + "/data/room/52.tmx", t_room);
asset->add(prefix + "/data/room/53.tmx", t_room);
asset->add(prefix + "/data/room/54.tmx", t_room);
asset->add(prefix + "/data/room/55.tmx", t_room);
asset->add(prefix + "/data/room/56.tmx", t_room);
asset->add(prefix + "/data/room/57.tmx", t_room);
asset->add(prefix + "/data/room/58.tmx", t_room);
asset->add(prefix + "/data/room/59.tmx", t_room);
asset->add(prefix + "/data/room/60.tmx", t_room);
Asset::get()->add(prefix + "/data/room/01.tmx", t_room);
Asset::get()->add(prefix + "/data/room/02.tmx", t_room);
Asset::get()->add(prefix + "/data/room/03.tmx", t_room);
Asset::get()->add(prefix + "/data/room/04.tmx", t_room);
Asset::get()->add(prefix + "/data/room/05.tmx", t_room);
Asset::get()->add(prefix + "/data/room/06.tmx", t_room);
Asset::get()->add(prefix + "/data/room/07.tmx", t_room);
Asset::get()->add(prefix + "/data/room/08.tmx", t_room);
Asset::get()->add(prefix + "/data/room/09.tmx", t_room);
Asset::get()->add(prefix + "/data/room/10.tmx", t_room);
Asset::get()->add(prefix + "/data/room/11.tmx", t_room);
Asset::get()->add(prefix + "/data/room/12.tmx", t_room);
Asset::get()->add(prefix + "/data/room/13.tmx", t_room);
Asset::get()->add(prefix + "/data/room/14.tmx", t_room);
Asset::get()->add(prefix + "/data/room/15.tmx", t_room);
Asset::get()->add(prefix + "/data/room/16.tmx", t_room);
Asset::get()->add(prefix + "/data/room/17.tmx", t_room);
Asset::get()->add(prefix + "/data/room/18.tmx", t_room);
Asset::get()->add(prefix + "/data/room/19.tmx", t_room);
Asset::get()->add(prefix + "/data/room/20.tmx", t_room);
Asset::get()->add(prefix + "/data/room/21.tmx", t_room);
Asset::get()->add(prefix + "/data/room/22.tmx", t_room);
Asset::get()->add(prefix + "/data/room/23.tmx", t_room);
Asset::get()->add(prefix + "/data/room/24.tmx", t_room);
Asset::get()->add(prefix + "/data/room/25.tmx", t_room);
Asset::get()->add(prefix + "/data/room/26.tmx", t_room);
Asset::get()->add(prefix + "/data/room/27.tmx", t_room);
Asset::get()->add(prefix + "/data/room/28.tmx", t_room);
Asset::get()->add(prefix + "/data/room/29.tmx", t_room);
Asset::get()->add(prefix + "/data/room/30.tmx", t_room);
Asset::get()->add(prefix + "/data/room/31.tmx", t_room);
Asset::get()->add(prefix + "/data/room/32.tmx", t_room);
Asset::get()->add(prefix + "/data/room/33.tmx", t_room);
Asset::get()->add(prefix + "/data/room/34.tmx", t_room);
Asset::get()->add(prefix + "/data/room/35.tmx", t_room);
Asset::get()->add(prefix + "/data/room/36.tmx", t_room);
Asset::get()->add(prefix + "/data/room/37.tmx", t_room);
Asset::get()->add(prefix + "/data/room/38.tmx", t_room);
Asset::get()->add(prefix + "/data/room/39.tmx", t_room);
Asset::get()->add(prefix + "/data/room/40.tmx", t_room);
Asset::get()->add(prefix + "/data/room/41.tmx", t_room);
Asset::get()->add(prefix + "/data/room/42.tmx", t_room);
Asset::get()->add(prefix + "/data/room/43.tmx", t_room);
Asset::get()->add(prefix + "/data/room/44.tmx", t_room);
Asset::get()->add(prefix + "/data/room/45.tmx", t_room);
Asset::get()->add(prefix + "/data/room/46.tmx", t_room);
Asset::get()->add(prefix + "/data/room/47.tmx", t_room);
Asset::get()->add(prefix + "/data/room/48.tmx", t_room);
Asset::get()->add(prefix + "/data/room/49.tmx", t_room);
Asset::get()->add(prefix + "/data/room/50.tmx", t_room);
Asset::get()->add(prefix + "/data/room/51.tmx", t_room);
Asset::get()->add(prefix + "/data/room/52.tmx", t_room);
Asset::get()->add(prefix + "/data/room/53.tmx", t_room);
Asset::get()->add(prefix + "/data/room/54.tmx", t_room);
Asset::get()->add(prefix + "/data/room/55.tmx", t_room);
Asset::get()->add(prefix + "/data/room/56.tmx", t_room);
Asset::get()->add(prefix + "/data/room/57.tmx", t_room);
Asset::get()->add(prefix + "/data/room/58.tmx", t_room);
Asset::get()->add(prefix + "/data/room/59.tmx", t_room);
Asset::get()->add(prefix + "/data/room/60.tmx", t_room);
// Tilesets
asset->add(prefix + "/data/tilesets/standard.png", t_bitmap);
asset->add(prefix + "/data/tilesets/standard_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/tilesets/standard.png", t_bitmap);
Asset::get()->add(prefix + "/data/tilesets/standard_zxarne.png", t_bitmap);
// Enemigos
asset->add(prefix + "/data/enemies/abad_bell.ani", t_data);
asset->add(prefix + "/data/enemies/abad_bell.png", t_bitmap);
asset->add(prefix + "/data/enemies/abad.ani", t_data);
asset->add(prefix + "/data/enemies/abad.png", t_bitmap);
asset->add(prefix + "/data/enemies/amstrad_cs.ani", t_data);
asset->add(prefix + "/data/enemies/amstrad_cs.png", t_bitmap);
asset->add(prefix + "/data/enemies/flying_arounder.ani", t_data);
asset->add(prefix + "/data/enemies/flying_arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/stopped_arounder.ani", t_data);
asset->add(prefix + "/data/enemies/stopped_arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/walking_arounder.ani", t_data);
asset->add(prefix + "/data/enemies/walking_arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounders_door.ani", t_data);
asset->add(prefix + "/data/enemies/arounders_door.png", t_bitmap);
asset->add(prefix + "/data/enemies/arounders_machine.ani", t_data);
asset->add(prefix + "/data/enemies/arounders_machine.png", t_bitmap);
asset->add(prefix + "/data/enemies/bat.ani", t_data);
asset->add(prefix + "/data/enemies/bat.png", t_bitmap);
asset->add(prefix + "/data/enemies/batman_bell.ani", t_data);
asset->add(prefix + "/data/enemies/batman_bell.png", t_bitmap);
asset->add(prefix + "/data/enemies/batman_fire.ani", t_data);
asset->add(prefix + "/data/enemies/batman_fire.png", t_bitmap);
asset->add(prefix + "/data/enemies/batman.ani", t_data);
asset->add(prefix + "/data/enemies/batman.png", t_bitmap);
asset->add(prefix + "/data/enemies/bell.ani", t_data);
asset->add(prefix + "/data/enemies/bell.png", t_bitmap);
asset->add(prefix + "/data/enemies/bin.ani", t_data);
asset->add(prefix + "/data/enemies/bin.png", t_bitmap);
asset->add(prefix + "/data/enemies/bird.ani", t_data);
asset->add(prefix + "/data/enemies/bird.png", t_bitmap);
asset->add(prefix + "/data/enemies/breakout.ani", t_data);
asset->add(prefix + "/data/enemies/breakout.png", t_bitmap);
asset->add(prefix + "/data/enemies/bry.ani", t_data);
asset->add(prefix + "/data/enemies/bry.png", t_bitmap);
asset->add(prefix + "/data/enemies/chip.ani", t_data);
asset->add(prefix + "/data/enemies/chip.png", t_bitmap);
asset->add(prefix + "/data/enemies/code.ani", t_data);
asset->add(prefix + "/data/enemies/code.png", t_bitmap);
asset->add(prefix + "/data/enemies/congo.ani", t_data);
asset->add(prefix + "/data/enemies/congo.png", t_bitmap);
asset->add(prefix + "/data/enemies/crosshair.ani", t_data);
asset->add(prefix + "/data/enemies/crosshair.png", t_bitmap);
asset->add(prefix + "/data/enemies/demon.ani", t_data);
asset->add(prefix + "/data/enemies/demon.png", t_bitmap);
asset->add(prefix + "/data/enemies/dimallas.ani", t_data);
asset->add(prefix + "/data/enemies/dimallas.png", t_bitmap);
asset->add(prefix + "/data/enemies/floppy.ani", t_data);
asset->add(prefix + "/data/enemies/floppy.png", t_bitmap);
asset->add(prefix + "/data/enemies/dong.ani", t_data);
asset->add(prefix + "/data/enemies/dong.png", t_bitmap);
asset->add(prefix + "/data/enemies/guitar.ani", t_data);
asset->add(prefix + "/data/enemies/guitar.png", t_bitmap);
asset->add(prefix + "/data/enemies/heavy.ani", t_data);
asset->add(prefix + "/data/enemies/heavy.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailer_#1.ani", t_data);
asset->add(prefix + "/data/enemies/jailer_#1.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailer_#2.ani", t_data);
asset->add(prefix + "/data/enemies/jailer_#2.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailer_#3.ani", t_data);
asset->add(prefix + "/data/enemies/jailer_#3.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailbattle_alien.ani", t_data);
asset->add(prefix + "/data/enemies/jailbattle_alien.png", t_bitmap);
asset->add(prefix + "/data/enemies/jailbattle_human.ani", t_data);
asset->add(prefix + "/data/enemies/jailbattle_human.png", t_bitmap);
asset->add(prefix + "/data/enemies/jeannine.ani", t_data);
asset->add(prefix + "/data/enemies/jeannine.png", t_bitmap);
asset->add(prefix + "/data/enemies/lamp.ani", t_data);
asset->add(prefix + "/data/enemies/lamp.png", t_bitmap);
asset->add(prefix + "/data/enemies/lord_abad.ani", t_data);
asset->add(prefix + "/data/enemies/lord_abad.png", t_bitmap);
asset->add(prefix + "/data/enemies/matatunos.ani", t_data);
asset->add(prefix + "/data/enemies/matatunos.png", t_bitmap);
asset->add(prefix + "/data/enemies/mummy.ani", t_data);
asset->add(prefix + "/data/enemies/mummy.png", t_bitmap);
asset->add(prefix + "/data/enemies/paco.ani", t_data);
asset->add(prefix + "/data/enemies/paco.png", t_bitmap);
asset->add(prefix + "/data/enemies/elsa.ani", t_data);
asset->add(prefix + "/data/enemies/elsa.png", t_bitmap);
asset->add(prefix + "/data/enemies/qvoid.ani", t_data);
asset->add(prefix + "/data/enemies/qvoid.png", t_bitmap);
asset->add(prefix + "/data/enemies/robot.ani", t_data);
asset->add(prefix + "/data/enemies/robot.png", t_bitmap);
asset->add(prefix + "/data/enemies/sam.ani", t_data);
asset->add(prefix + "/data/enemies/sam.png", t_bitmap);
asset->add(prefix + "/data/enemies/shock.ani", t_data);
asset->add(prefix + "/data/enemies/shock.png", t_bitmap);
asset->add(prefix + "/data/enemies/sigmasua.ani", t_data);
asset->add(prefix + "/data/enemies/sigmasua.png", t_bitmap);
asset->add(prefix + "/data/enemies/spark.ani", t_data);
asset->add(prefix + "/data/enemies/spark.png", t_bitmap);
asset->add(prefix + "/data/enemies/special/aerojailer.ani", t_data);
asset->add(prefix + "/data/enemies/special/aerojailer.png", t_bitmap);
asset->add(prefix + "/data/enemies/special/arounder.ani", t_data);
asset->add(prefix + "/data/enemies/special/arounder.png", t_bitmap);
asset->add(prefix + "/data/enemies/special/pepe_rosita_job.ani", t_data);
asset->add(prefix + "/data/enemies/special/pepe_rosita_job.png", t_bitmap);
asset->add(prefix + "/data/enemies/special/shooting_star.ani", t_data);
asset->add(prefix + "/data/enemies/special/shooting_star.png", t_bitmap);
asset->add(prefix + "/data/enemies/spider.ani", t_data);
asset->add(prefix + "/data/enemies/spider.png", t_bitmap);
asset->add(prefix + "/data/enemies/tree_thing.ani", t_data);
asset->add(prefix + "/data/enemies/tree_thing.png", t_bitmap);
asset->add(prefix + "/data/enemies/tuno.ani", t_data);
asset->add(prefix + "/data/enemies/tuno.png", t_bitmap);
asset->add(prefix + "/data/enemies/tv_panel.ani", t_data);
asset->add(prefix + "/data/enemies/tv_panel.png", t_bitmap);
asset->add(prefix + "/data/enemies/tv.ani", t_data);
asset->add(prefix + "/data/enemies/tv.png", t_bitmap);
asset->add(prefix + "/data/enemies/upv_student.ani", t_data);
asset->add(prefix + "/data/enemies/upv_student.png", t_bitmap);
asset->add(prefix + "/data/enemies/wave.ani", t_data);
asset->add(prefix + "/data/enemies/wave.png", t_bitmap);
asset->add(prefix + "/data/enemies/z80.ani", t_data);
asset->add(prefix + "/data/enemies/z80.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/abad_bell.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/abad_bell.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/abad.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/abad.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/amstrad_cs.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/amstrad_cs.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/flying_arounder.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/flying_arounder.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/stopped_arounder.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/stopped_arounder.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/walking_arounder.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/walking_arounder.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/arounders_door.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/arounders_door.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/arounders_machine.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/arounders_machine.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/bat.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/bat.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/batman_bell.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/batman_bell.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/batman_fire.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/batman_fire.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/batman.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/batman.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/bell.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/bell.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/bin.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/bin.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/bird.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/bird.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/breakout.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/breakout.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/bry.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/bry.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/chip.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/chip.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/code.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/code.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/congo.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/congo.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/crosshair.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/crosshair.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/demon.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/demon.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/dimallas.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/dimallas.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/floppy.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/floppy.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/dong.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/dong.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/guitar.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/guitar.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/heavy.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/heavy.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/jailer_#1.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/jailer_#1.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/jailer_#2.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/jailer_#2.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/jailer_#3.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/jailer_#3.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/jailbattle_alien.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/jailbattle_alien.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/jailbattle_human.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/jailbattle_human.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/jeannine.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/jeannine.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/lamp.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/lamp.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/lord_abad.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/lord_abad.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/matatunos.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/matatunos.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/mummy.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/mummy.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/paco.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/paco.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/elsa.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/elsa.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/qvoid.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/qvoid.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/robot.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/robot.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/sam.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/sam.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/shock.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/shock.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/sigmasua.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/sigmasua.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/spark.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/spark.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/special/aerojailer.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/special/aerojailer.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/special/arounder.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/special/arounder.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/special/pepe_rosita_job.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/special/pepe_rosita_job.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/special/shooting_star.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/special/shooting_star.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/spider.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/spider.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/tree_thing.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/tree_thing.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/tuno.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/tuno.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/tv_panel.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/tv_panel.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/tv.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/tv.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/upv_student.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/upv_student.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/wave.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/wave.png", t_bitmap);
Asset::get()->add(prefix + "/data/enemies/z80.ani", t_data);
Asset::get()->add(prefix + "/data/enemies/z80.png", t_bitmap);
// Jugador
asset->add(prefix + "/data/player/player.png", t_bitmap);
asset->add(prefix + "/data/player/player.ani", t_data);
asset->add(prefix + "/data/player/player2.png", t_bitmap);
asset->add(prefix + "/data/player/player2.ani", t_data);
asset->add(prefix + "/data/player/player_game_over.png", t_bitmap);
asset->add(prefix + "/data/player/player_game_over.ani", t_data);
Asset::get()->add(prefix + "/data/player/player.png", t_bitmap);
Asset::get()->add(prefix + "/data/player/player.ani", t_data);
Asset::get()->add(prefix + "/data/player/player2.png", t_bitmap);
Asset::get()->add(prefix + "/data/player/player2.ani", t_data);
Asset::get()->add(prefix + "/data/player/player_game_over.png", t_bitmap);
Asset::get()->add(prefix + "/data/player/player_game_over.ani", t_data);
// Items
asset->add(prefix + "/data/items/items.png", t_bitmap);
Asset::get()->add(prefix + "/data/items/items.png", t_bitmap);
// Musicas
asset->add(prefix + "/data/music/title.ogg", t_music);
asset->add(prefix + "/data/music/game.ogg", t_music);
asset->add(prefix + "/data/music/loading_sound1.ogg", t_music);
asset->add(prefix + "/data/music/loading_sound2.ogg", t_music);
asset->add(prefix + "/data/music/loading_sound3.ogg", t_music);
asset->add(prefix + "/data/music/ending1.ogg", t_music);
asset->add(prefix + "/data/music/ending2.ogg", t_music);
asset->add(prefix + "/data/music/game_over.ogg", t_music);
Asset::get()->add(prefix + "/data/music/title.ogg", t_music);
Asset::get()->add(prefix + "/data/music/game.ogg", t_music);
Asset::get()->add(prefix + "/data/music/loading_sound1.ogg", t_music);
Asset::get()->add(prefix + "/data/music/loading_sound2.ogg", t_music);
Asset::get()->add(prefix + "/data/music/loading_sound3.ogg", t_music);
Asset::get()->add(prefix + "/data/music/ending1.ogg", t_music);
Asset::get()->add(prefix + "/data/music/ending2.ogg", t_music);
Asset::get()->add(prefix + "/data/music/game_over.ogg", t_music);
// Efectos de sonido
asset->add(prefix + "/data/sound/item.wav", t_sound);
asset->add(prefix + "/data/sound/death.wav", t_sound);
asset->add(prefix + "/data/sound/jump1.wav", t_sound);
asset->add(prefix + "/data/sound/jump2.wav", t_sound);
asset->add(prefix + "/data/sound/jump3.wav", t_sound);
asset->add(prefix + "/data/sound/jump4.wav", t_sound);
asset->add(prefix + "/data/sound/jump5.wav", t_sound);
asset->add(prefix + "/data/sound/jump6.wav", t_sound);
asset->add(prefix + "/data/sound/jump7.wav", t_sound);
asset->add(prefix + "/data/sound/jump8.wav", t_sound);
asset->add(prefix + "/data/sound/jump9.wav", t_sound);
asset->add(prefix + "/data/sound/jump10.wav", t_sound);
asset->add(prefix + "/data/sound/jump11.wav", t_sound);
asset->add(prefix + "/data/sound/jump12.wav", t_sound);
asset->add(prefix + "/data/sound/jump13.wav", t_sound);
asset->add(prefix + "/data/sound/jump14.wav", t_sound);
asset->add(prefix + "/data/sound/jump15.wav", t_sound);
asset->add(prefix + "/data/sound/jump16.wav", t_sound);
asset->add(prefix + "/data/sound/jump17.wav", t_sound);
asset->add(prefix + "/data/sound/jump18.wav", t_sound);
asset->add(prefix + "/data/sound/jump19.wav", t_sound);
asset->add(prefix + "/data/sound/jump20.wav", t_sound);
asset->add(prefix + "/data/sound/jump21.wav", t_sound);
asset->add(prefix + "/data/sound/jump22.wav", t_sound);
asset->add(prefix + "/data/sound/jump23.wav", t_sound);
asset->add(prefix + "/data/sound/jump24.wav", t_sound);
asset->add(prefix + "/data/sound/notify.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/item.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/death.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump1.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump2.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump3.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump4.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump5.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump6.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump7.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump8.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump9.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump10.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump11.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump12.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump13.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump14.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump15.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump16.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump17.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump18.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump19.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump20.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump21.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump22.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump23.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/jump24.wav", t_sound);
Asset::get()->add(prefix + "/data/sound/notify.wav", t_sound);
// Logo
asset->add(prefix + "/data/logo/jailgames.png", t_bitmap);
asset->add(prefix + "/data/logo/since_1998.png", t_bitmap);
Asset::get()->add(prefix + "/data/logo/jailgames.png", t_bitmap);
Asset::get()->add(prefix + "/data/logo/since_1998.png", t_bitmap);
// Intro
asset->add(prefix + "/data/title/loading_screen_bn.png", t_bitmap);
asset->add(prefix + "/data/title/loading_screen_color.png", t_bitmap);
asset->add(prefix + "/data/title/loading_screen_bn_zxarne.png", t_bitmap);
asset->add(prefix + "/data/title/loading_screen_color_zxarne.png", t_bitmap);
asset->add(prefix + "/data/title/loading_screen_color.gif", t_bitmap);
asset->add(prefix + "/data/title/title_logo.png", t_bitmap);
Asset::get()->add(prefix + "/data/title/loading_screen_bn.png", t_bitmap);
Asset::get()->add(prefix + "/data/title/loading_screen_color.png", t_bitmap);
Asset::get()->add(prefix + "/data/title/loading_screen_bn_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/title/loading_screen_color_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/title/loading_screen_color.gif", t_bitmap);
Asset::get()->add(prefix + "/data/title/title_logo.png", t_bitmap);
// Ending
asset->add(prefix + "/data/ending/ending1.png", t_bitmap);
asset->add(prefix + "/data/ending/ending1_zxarne.png", t_bitmap);
asset->add(prefix + "/data/ending/ending2.png", t_bitmap);
asset->add(prefix + "/data/ending/ending2_zxarne.png", t_bitmap);
asset->add(prefix + "/data/ending/ending3.png", t_bitmap);
asset->add(prefix + "/data/ending/ending3_zxarne.png", t_bitmap);
asset->add(prefix + "/data/ending/ending4.png", t_bitmap);
asset->add(prefix + "/data/ending/ending4_zxarne.png", t_bitmap);
asset->add(prefix + "/data/ending/ending5.png", t_bitmap);
asset->add(prefix + "/data/ending/ending5_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending1.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending1_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending2.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending2_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending3.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending3_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending4.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending4_zxarne.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending5.png", t_bitmap);
Asset::get()->add(prefix + "/data/ending/ending5_zxarne.png", t_bitmap);
// Credits
asset->add(prefix + "/data/credits/shine.png", t_bitmap);
asset->add(prefix + "/data/credits/shine.ani", t_bitmap);
Asset::get()->add(prefix + "/data/credits/shine.png", t_bitmap);
Asset::get()->add(prefix + "/data/credits/shine.ani", t_bitmap);
return asset->check();
return Asset::get()->check();
}
// Ejecuta la seccion de juego con el logo
@@ -1725,7 +1724,7 @@ void Director::runLogo()
std::cout << "\n* SECTION: LOGO" << std::endl;
}
loadResources(section);
auto logo = std::make_unique<Logo>(renderer, screen, resource, asset, input, options, section);
auto logo = std::make_unique<Logo>(renderer, screen, resource, Asset::get(), input, options, section);
logo->run();
resource->free();
}
@@ -1738,7 +1737,7 @@ void Director::runLoadingScreen()
std::cout << "\n* SECTION: INTRO" << std::endl;
}
loadResources(section);
auto loadingScreen = std::make_unique<LoadingScreen>(renderer, screen, resource, asset, input, options, section);
auto loadingScreen = std::make_unique<LoadingScreen>(renderer, screen, resource, Asset::get(), input, options, section);
loadingScreen->run();
resource->free();
}
@@ -1755,7 +1754,7 @@ void Director::runTitle()
JA_PlayMusic(music);
}
loadResources(section);
auto title = std::make_unique<Title>(renderer, screen, resource, asset, input, options, section);
auto title = std::make_unique<Title>(renderer, screen, resource, input, options, section);
title->run();
resource->free();
}
@@ -1768,7 +1767,7 @@ void Director::runCredits()
std::cout << "\n* SECTION: CREDITS" << std::endl;
}
loadResources(section);
auto credits = std::make_unique<Credits>(renderer, screen, resource, asset, input, options, section);
auto credits = std::make_unique<Credits>(renderer, screen, resource, Asset::get(), input, options, section);
credits->run();
resource->free();
}
@@ -1781,7 +1780,7 @@ void Director::runDemo()
std::cout << "\n* SECTION: DEMO" << std::endl;
}
loadResources(section);
auto demo = std::make_unique<Demo>(renderer, screen, resource, asset, input, options, section, debug);
auto demo = std::make_unique<Demo>(renderer, screen, resource, Asset::get(), input, options, section, debug);
demo->run();
resource->free();
}
@@ -1794,7 +1793,7 @@ void Director::runEnding()
std::cout << "\n* SECTION: ENDING" << std::endl;
}
loadResources(section);
auto ending = std::make_unique<Ending>(renderer, screen, resource, asset, input, options, section);
auto ending = std::make_unique<Ending>(renderer, screen, resource, Asset::get(), input, options, section);
ending->run();
resource->free();
}
@@ -1807,7 +1806,7 @@ void Director::runEnding2()
std::cout << "\n* SECTION: ENDING2" << std::endl;
}
loadResources(section);
auto ending2 = std::make_unique<Ending2>(renderer, screen, resource, asset, input, options, section);
auto ending2 = std::make_unique<Ending2>(renderer, screen, resource, Asset::get(), input, options, section);
ending2->run();
resource->free();
}
@@ -1820,7 +1819,7 @@ void Director::runGameOver()
std::cout << "\n* SECTION: GAME OVER" << std::endl;
}
loadResources(section);
auto gameOver = std::make_unique<GameOver>(renderer, screen, resource, asset, input, options, section);
auto gameOver = std::make_unique<GameOver>(renderer, screen, resource, Asset::get(), input, options, section);
gameOver->run();
resource->free();
}
@@ -1834,7 +1833,7 @@ void Director::runGame()
}
JA_StopMusic();
loadResources(section);
auto game = std::make_unique<Game>(renderer, screen, resource, asset, options, input, section, debug);
auto game = std::make_unique<Game>(renderer, screen, resource, Asset::get(), options, input, section, debug);
game->run();
resource->free();
}

View File

@@ -20,7 +20,6 @@ private:
SDL_Renderer *renderer; // El renderizador de la ventana
Screen *screen; // Objeto encargado de dibujar en pantalla
Resource *resource; // Objeto con los recursos
Asset *asset; // Objeto que gestiona todos los ficheros de recursos
Input *input; // Objeto Input para gestionar las entradas
Debug *debug; // Objeto para getsionar la información de debug
struct options_t *options; // Variable con todas las opciones del programa

View File

@@ -17,65 +17,57 @@
#include "utils.h" // Para color_t, stringToColor, options_t
// Constructor
Title::Title(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section)
Title::Title(SDL_Renderer *renderer, Screen *screen, Resource *resource, Input *input, options_t *options, section_t *section)
: renderer_(renderer),
screen_(screen),
resource_(resource),
input_(input),
options_(options),
section_(section)
{
// Copia la dirección de los objetos
this->resource = resource;
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
this->input = input;
this->options = options;
this->section = section;
// Reserva memoria para los punteros
eventHandler = new SDL_Event();
cheevos = new Cheevos(screen, options, asset->get("cheevos.bin"));
event_handler_ = new SDL_Event();
cheevos_ = std::make_unique<Cheevos>(screen, options, Asset::get()->get("cheevos.bin"));
if (options->palette == p_zxspectrum)
{
texture = resource->getTexture("title_logo.png");
texture_ = resource->getTexture("title_logo.png");
}
else if (options->palette == p_zxarne)
{
texture = resource->getTexture("title_logo.png");
texture_ = resource->getTexture("title_logo.png");
}
sprite = new Sprite(0, 0, texture->getWidth(), texture->getHeight(), texture, renderer);
text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer);
infoText = new Text(resource->getOffset("subatomic.txt"), resource->getTexture("subatomic.png"), renderer);
sprite_ = new Sprite(0, 0, texture_->getWidth(), texture_->getHeight(), texture_, renderer);
text_ = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer);
info_text_ = new Text(resource->getOffset("subatomic.txt"), resource->getTexture("subatomic.png"), renderer);
// Crea la textura para los graficos que aparecen en el fondo de la pantalla de titulo
bgTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT);
if (bgTexture == nullptr)
bg_texture_ = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT);
if (bg_texture_ == nullptr)
{
if (options->console)
{
std::cout << "Error: bgTexture could not be created!\nSDL Error: " << SDL_GetError() << std::endl;
}
}
SDL_SetTextureBlendMode(bgTexture, SDL_BLENDMODE_BLEND);
SDL_SetTextureBlendMode(bg_texture_, SDL_BLENDMODE_BLEND);
// Carga la surface con los gráficos de la pantalla de carga
pInit(renderer, 256, 128);
loading_screen = pLoadSurface(asset->get("loading_screen_color.gif").c_str());
pLoadPal(asset->get("loading_screen_color.gif").c_str());
pSetSource(loading_screen);
loading_screen_ = pLoadSurface(Asset::get()->get("loading_screen_color.gif").c_str());
pLoadPal(Asset::get()->get("loading_screen_color.gif").c_str());
pSetSource(loading_screen_);
// Inicializa variables
counter = 0;
state = section->subsection == SUBSECTION_TITLE_WITH_LOADING_SCREEN ? show_loading_screen : show_menu;
section->name = SECTION_TITLE;
section->subsection = 0;
ticks = 0;
ticksSpeed = 15;
marqueeSpeed = 3;
state_ = section_->subsection == SUBSECTION_TITLE_WITH_LOADING_SCREEN ? show_loading_screen : show_menu;
section_->name = SECTION_TITLE;
section_->subsection = 0;
initMarquee();
showCheevos = false;
// Crea y rellena la textura para mostrar los logros
createCheevosTexture();
// Cambia el color del borde
screen->setBorderColor(stringToColor(options->palette, "black"));
screen_->setBorderColor(stringToColor(options->palette, "black"));
// Rellena la textura de fondo con todos los gráficos
fillTexture();
@@ -84,60 +76,59 @@ Title::Title(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *
// Destructor
Title::~Title()
{
delete cheevos;
delete eventHandler;
delete sprite;
delete cheevosSprite;
delete cheevosTexture;
delete text;
delete infoText;
pDeleteSurface(loading_screen);
SDL_DestroyTexture(bgTexture);
delete event_handler_;
delete sprite_;
delete cheevos_sprite_;
delete cheevos_texture_;
delete text_;
delete info_text_;
pDeleteSurface(loading_screen_);
SDL_DestroyTexture(bg_texture_);
}
// Inicializa la marquesina
void Title::initMarquee()
{
letters.clear();
longText = "HEY JAILERS!! IT'S 2022 AND WE'RE STILL ROCKING LIKE IT'S 1998!!! HAVE YOU HEARD IT? JAILGAMES ARE BACK!! YEEESSS BACK!! MORE THAN 10 TITLES ON JAILDOC'S KITCHEN!! THATS A LOOOOOOT OF JAILGAMES, BUT WHICH ONE WILL STRIKE FIRST? THERE IS ALSO A NEW DEVICE TO COME THAT WILL BLOW YOUR MIND WITH JAILGAMES ON THE GO: P.A.C.O. BUT WAIT! WHAT'S THAT BEAUTY I'M SEEING RIGHT OVER THERE?? OOOH THAT TINY MINIASCII IS PURE LOVE!! I WANT TO LICK EVERY BYTE OF IT!! OH SHIT! AND DON'T FORGET TO BRING BACK THOSE OLD AND FAT MS-DOS JAILGAMES TO GITHUB TO KEEP THEM ALIVE!! WHAT WILL BE THE NEXT JAILDOC RELEASE? WHAT WILL BE THE NEXT PROJECT TO COME ALIVE?? OH BABY WE DON'T KNOW BUT HERE YOU CAN FIND THE ANSWER, YOU JUST HAVE TO COMPLETE JAILDOCTOR'S DILEMMA ... COULD YOU?";
for (int i = 0; i < (int)longText.length(); ++i)
letters_.clear();
long_text_ = "HEY JAILERS!! IT'S 2022 AND WE'RE STILL ROCKING LIKE IT'S 1998!!! HAVE YOU HEARD IT? JAILGAMES ARE BACK!! YEEESSS BACK!! MORE THAN 10 TITLES ON JAILDOC'S KITCHEN!! THATS A LOOOOOOT OF JAILGAMES, BUT WHICH ONE WILL STRIKE FIRST? THERE IS ALSO A NEW DEVICE TO COME THAT WILL BLOW YOUR MIND WITH JAILGAMES ON THE GO: P.A.C.O. BUT WAIT! WHAT'S THAT BEAUTY I'M SEEING RIGHT OVER THERE?? OOOH THAT TINY MINIASCII IS PURE LOVE!! I WANT TO LICK EVERY BYTE OF IT!! OH SHIT! AND DON'T FORGET TO BRING BACK THOSE OLD AND FAT MS-DOS JAILGAMES TO GITHUB TO KEEP THEM ALIVE!! WHAT WILL BE THE NEXT JAILDOC RELEASE? WHAT WILL BE THE NEXT PROJECT TO COME ALIVE?? OH BABY WE DON'T KNOW BUT HERE YOU CAN FIND THE ANSWER, YOU JUST HAVE TO COMPLETE JAILDOCTOR'S DILEMMA ... COULD YOU?";
for (int i = 0; i < (int)long_text_.length(); ++i)
{
letter_t l;
l.letter = longText.substr(i, 1);
l.letter = long_text_.substr(i, 1);
l.x = 256;
l.enabled = false;
letters.push_back(l);
letters_.push_back(l);
}
letters[0].enabled = true;
letters_[0].enabled = true;
}
// Comprueba el manejador de eventos
void Title::checkEvents()
{
// Comprueba los eventos que hay en la cola
while (SDL_PollEvent(eventHandler) != 0)
while (SDL_PollEvent(event_handler_) != 0)
{
// Evento de salida de la aplicación
if (eventHandler->type == SDL_QUIT)
if (event_handler_->type == SDL_QUIT)
{
section->name = SECTION_QUIT;
section_->name = SECTION_QUIT;
break;
}
// Solo se comprueban estas teclas si no está activo el menu de logros
if (eventHandler->type == SDL_KEYDOWN)
if (event_handler_->type == SDL_KEYDOWN)
{
if (!showCheevos)
if (!show_cheevos_)
{
switch (eventHandler->key.keysym.scancode)
switch (event_handler_->key.keysym.scancode)
{
case SDL_SCANCODE_1:
section->name = SECTION_GAME;
section->subsection = 0;
section_->name = SECTION_GAME;
section_->subsection = 0;
break;
case SDL_SCANCODE_2:
showCheevos = true;
show_cheevos_ = true;
break;
default:
@@ -151,70 +142,70 @@ void Title::checkEvents()
// Comprueba las entradas
void Title::checkInput()
{
if (showCheevos)
if (show_cheevos_)
{
if (input->checkInput(input_down, REPEAT_TRUE))
if (input_->checkInput(input_down, REPEAT_TRUE))
{
moveCheevosList(1);
}
else if (input->checkInput(input_up, REPEAT_TRUE))
else if (input_->checkInput(input_up, REPEAT_TRUE))
{
moveCheevosList(0);
}
}
if (input->checkInput(input_exit, REPEAT_FALSE))
if (input_->checkInput(input_exit, REPEAT_FALSE))
{
if (showCheevos)
if (show_cheevos_)
{
hideCheevosList();
counter = 0;
counter_ = 0;
}
else
{
section->name = SECTION_QUIT;
section_->name = SECTION_QUIT;
}
}
else if (input->checkInput(input_toggle_border, REPEAT_FALSE))
else if (input_->checkInput(input_toggle_border, REPEAT_FALSE))
{
screen->toggleBorder();
resource->reLoadTextures();
screen_->toggleBorder();
resource_->reLoadTextures();
}
else if (input->checkInput(input_toggle_videomode, REPEAT_FALSE))
else if (input_->checkInput(input_toggle_videomode, REPEAT_FALSE))
{
screen->toggleVideoMode();
resource->reLoadTextures();
screen_->toggleVideoMode();
resource_->reLoadTextures();
}
else if (input->checkInput(input_toggle_shaders, REPEAT_FALSE))
else if (input_->checkInput(input_toggle_shaders, REPEAT_FALSE))
{
screen->toggleShaders();
screen_->toggleShaders();
}
else if (input->checkInput(input_window_dec_size, REPEAT_FALSE))
else if (input_->checkInput(input_window_dec_size, REPEAT_FALSE))
{
screen->decWindowSize();
resource->reLoadTextures();
screen_->decWindowSize();
resource_->reLoadTextures();
}
else if (input->checkInput(input_window_inc_size, REPEAT_FALSE))
else if (input_->checkInput(input_window_inc_size, REPEAT_FALSE))
{
screen->incWindowSize();
resource->reLoadTextures();
screen_->incWindowSize();
resource_->reLoadTextures();
}
else if (input->checkInput(input_toggle_palette, REPEAT_FALSE))
else if (input_->checkInput(input_toggle_palette, REPEAT_FALSE))
{
switchPalette();
}
else if (input->checkInput(input_accept, REPEAT_FALSE) || input->checkInput(input_pause, REPEAT_FALSE))
else if (input_->checkInput(input_accept, REPEAT_FALSE) || input_->checkInput(input_pause, REPEAT_FALSE))
{
if (state == show_loading_screen)
if (state_ == show_loading_screen)
{
state = fade_loading_screen;
state_ = fade_loading_screen;
}
}
}
@@ -222,28 +213,28 @@ void Title::checkInput()
// Actualiza la marquesina
void Title::updateMarquee()
{
for (int i = 0; i < (int)letters.size(); ++i)
for (int i = 0; i < (int)letters_.size(); ++i)
{
if (letters[i].enabled)
if (letters_[i].enabled)
{
letters[i].x -= marqueeSpeed;
if (letters[i].x < -10)
letters_[i].x -= marquee_speed_;
if (letters_[i].x < -10)
{
letters[i].enabled = false;
letters_[i].enabled = false;
}
}
else
{
if (i > 0 && letters[i - 1].x < 256 && letters[i - 1].enabled)
if (i > 0 && letters_[i - 1].x < 256 && letters_[i - 1].enabled)
{
letters[i].enabled = true;
letters[i].x = letters[i - 1].x + text->lenght(letters[i - 1].letter) + 1;
letters_[i].enabled = true;
letters_[i].x = letters_[i - 1].x + text_->lenght(letters_[i - 1].letter) + 1;
}
}
}
// Comprueba si ha terminado la marquesina y la reinicia
if (letters[letters.size() - 1].x < -10)
if (letters_[letters_.size() - 1].x < -10)
{ // Inicializa la marquesina
initMarquee();
}
@@ -252,11 +243,11 @@ void Title::updateMarquee()
// Dibuja la marquesina
void Title::renderMarquee()
{
for (auto l : letters)
for (auto l : letters_)
{
if (l.enabled)
{
text->writeColored(l.x, 184, l.letter, stringToColor(options->palette, "white"));
text_->writeColored(l.x, 184, l.letter, stringToColor(options_->palette, "white"));
}
}
}
@@ -265,44 +256,44 @@ void Title::renderMarquee()
void Title::renderInfo()
{
const std::string version = "v.1.09";
const int x = GAMECANVAS_WIDTH - infoText->lenght(version) - 1;
infoText->write(x, 1, version);
const int x = GAMECANVAS_WIDTH - info_text_->lenght(version) - 1;
info_text_->write(x, 1, version);
}
// Actualiza las variables
void Title::update()
{
// Comprueba que la diferencia de ticks sea mayor a la velocidad del juego
if (SDL_GetTicks() - ticks > ticksSpeed)
if (SDL_GetTicks() - ticks_ > ticks_speed_)
{
// Actualiza el contador de ticks
ticks = SDL_GetTicks();
ticks_ = SDL_GetTicks();
// Comprueba las entradas
checkInput();
// Actualiza las notificaciones
screen->updateNotifier();
screen_->updateNotifier();
// Incrementa el contador
counter++;
counter_++;
switch (state)
switch (state_)
{
case show_loading_screen:
if (counter == 500)
if (counter_ == 500)
{
counter = 0;
state = fade_loading_screen;
counter_ = 0;
state_ = fade_loading_screen;
}
break;
case fade_loading_screen:
if (counter % 4 == 0)
if (counter_ % 4 == 0)
if (pFadePal())
{
counter = 0;
state = show_menu;
counter_ = 0;
state_ = show_menu;
}
break;
@@ -311,12 +302,12 @@ void Title::update()
updateMarquee();
// Si el contador alcanza cierto valor, termina la seccion
if (counter == 2200)
if (counter_ == 2200)
{
if (!showCheevos)
if (!show_cheevos_)
{
section->name = SECTION_CREDITS;
section->subsection = 0;
section_->name = SECTION_CREDITS;
section_->subsection = 0;
}
}
break;
@@ -331,21 +322,21 @@ void Title::update()
void Title::render()
{
// Prepara para empezar a dibujar en la textura de juego
screen->start();
screen->clean(stringToColor(options->palette, "black"));
screen_->start();
screen_->clean(stringToColor(options_->palette, "black"));
if (state == show_menu)
if (state_ == show_menu)
{
// Dibuja la textura de fondo
SDL_RenderCopy(renderer, bgTexture, nullptr, nullptr);
SDL_RenderCopy(renderer_, bg_texture_, nullptr, nullptr);
// Dibuja la marquesina
renderMarquee();
// Dibuja la información de logros
if (showCheevos)
if (show_cheevos_)
{
cheevosSprite->render();
cheevos_sprite_->render();
}
}
else
@@ -353,20 +344,20 @@ void Title::render()
// Dibuja la pantalla de carga
pCls(4);
pBlit(0, 0, 0, 0, 256, 128);
pFlip(renderer);
pFlip(renderer_);
// Dibuja el logo del título
sprite->render();
sprite_->render();
}
// Vuelca el contenido del renderizador en pantalla
screen->render();
screen_->render();
}
// Bucle para el logo del juego
void Title::run()
{
while (section->name == SECTION_TITLE)
while (section_->name == SECTION_TITLE)
{
update();
checkEvents();
@@ -378,112 +369,112 @@ void Title::run()
void Title::reLoadTextures()
{
// Carga la textura adecuada
if (options->palette == p_zxspectrum)
if (options_->palette == p_zxspectrum)
{
texture = resource->getTexture("loading_screen_color.png");
texture_ = resource_->getTexture("loading_screen_color.png");
}
else if (options->palette == p_zxarne)
else if (options_->palette == p_zxarne)
{
texture = resource->getTexture("loading_screen_color_zxarne.png");
texture_ = resource_->getTexture("loading_screen_color_zxarne.png");
}
texture->reLoad();
texture_->reLoad();
}
// Cambia la paleta
void Title::switchPalette()
{
if (options->palette == p_zxspectrum)
if (options_->palette == p_zxspectrum)
{
options->palette = p_zxarne;
sprite->setTexture(resource->getTexture("loading_screen_color_zxarne.png"));
options_->palette = p_zxarne;
sprite_->setTexture(resource_->getTexture("loading_screen_color_zxarne.png"));
}
else
{
options->palette = p_zxspectrum;
sprite->setTexture(resource->getTexture("loading_screen_color.png"));
options_->palette = p_zxspectrum;
sprite_->setTexture(resource_->getTexture("loading_screen_color.png"));
}
// Cambia el color del borde
screen->setBorderColor(stringToColor(options->palette, "bright_blue"));
screen_->setBorderColor(stringToColor(options_->palette, "bright_blue"));
}
// Desplaza la lista de logros
void Title::moveCheevosList(int direction)
{
const int speed = 2;
cheevosTextureView.y = direction == 0 ? cheevosTextureView.y - speed : cheevosTextureView.y + speed;
cheevos_texture_view_.y = direction == 0 ? cheevos_texture_view_.y - speed : cheevos_texture_view_.y + speed;
const int bottom = cheevosTexture->getHeight() - cheevosTextureView.h;
if (cheevosTextureView.y < 0)
const int bottom = cheevos_texture_->getHeight() - cheevos_texture_view_.h;
if (cheevos_texture_view_.y < 0)
{
cheevosTextureView.y = 0;
cheevos_texture_view_.y = 0;
}
else if (cheevosTextureView.y > bottom)
else if (cheevos_texture_view_.y > bottom)
{
cheevosTextureView.y = bottom;
cheevos_texture_view_.y = bottom;
}
cheevosSprite->setSpriteClip(cheevosTextureView);
cheevos_sprite_->setSpriteClip(cheevos_texture_view_);
}
// Rellena la textura de fondo con todos los gráficos
void Title::fillTexture()
{
// Coloca el puntero del renderizador sobre la textura
SDL_SetRenderTarget(renderer, bgTexture);
SDL_SetRenderTarget(renderer_, bg_texture_);
// Rellena la textura de color
const color_t c = stringToColor(options->palette, "black");
SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0xFF);
SDL_RenderClear(renderer);
const color_t c = stringToColor(options_->palette, "black");
SDL_SetRenderDrawColor(renderer_, c.r, c.g, c.b, 0xFF);
SDL_RenderClear(renderer_);
// Pinta el gráfico del titulo a partir del sprite
sprite->render();
sprite_->render();
// Escribe el texto en la textura
const color_t textColor = stringToColor(options->palette, "green");
const int textSize = text->getCharacterSize();
text->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 11 * textSize, "1.PLAY", 1, textColor);
text->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 13 * textSize, "2.ACHIEVEMENTS", 1, textColor);
text->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 15 * textSize, "3.REDEFINE KEYS", 1, textColor);
text->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 20 * textSize, "ESC.EXIT GAME", 1, textColor);
const color_t textColor = stringToColor(options_->palette, "green");
const int textSize = text_->getCharacterSize();
text_->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 11 * textSize, "1.PLAY", 1, textColor);
text_->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 13 * textSize, "2.ACHIEVEMENTS", 1, textColor);
text_->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 15 * textSize, "3.REDEFINE KEYS", 1, textColor);
text_->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, 20 * textSize, "ESC.EXIT GAME", 1, textColor);
// Devuelve el puntero del renderizador a su sitio
SDL_SetRenderTarget(renderer, nullptr);
SDL_SetRenderTarget(renderer_, nullptr);
}
// Crea y rellena la textura para mostrar los logros
void Title::createCheevosTexture()
{
// Crea la textura con el listado de logros
const std::vector<cheevos_t> cheevosList = cheevos->list();
const std::vector<cheevos_t> cheevosList = cheevos_->list();
const int cheevosTextureWidth = 200;
const int cheevosTextureViewHeight = 110;
const int cheevosTexturePosY = 73;
const int cheevosPadding = 10;
const int cheevoHeight = cheevosPadding + (infoText->getCharacterSize() * 2) + 1;
const int cheevosTextureHeight = (cheevoHeight * cheevosList.size()) + 2 + infoText->getCharacterSize() + 8;
cheevosTexture = new Texture(renderer);
cheevosTexture->createBlank(renderer, cheevosTextureWidth, cheevosTextureHeight, SDL_TEXTUREACCESS_TARGET);
cheevosTexture->setAsRenderTarget(renderer);
cheevosTexture->setBlendMode(SDL_BLENDMODE_BLEND);
const int cheevoHeight = cheevosPadding + (info_text_->getCharacterSize() * 2) + 1;
const int cheevosTextureHeight = (cheevoHeight * cheevosList.size()) + 2 + info_text_->getCharacterSize() + 8;
cheevos_texture_ = new Texture(renderer_);
cheevos_texture_->createBlank(renderer_, cheevosTextureWidth, cheevosTextureHeight, SDL_TEXTUREACCESS_TARGET);
cheevos_texture_->setAsRenderTarget(renderer_);
cheevos_texture_->setBlendMode(SDL_BLENDMODE_BLEND);
// Rellena la textura con color sólido
const color_t cheevosBGColor = stringToColor(options->palette, "black");
SDL_SetRenderDrawColor(renderer, cheevosBGColor.r, cheevosBGColor.g, cheevosBGColor.b, 0xFF);
SDL_RenderClear(renderer);
const color_t cheevosBGColor = stringToColor(options_->palette, "black");
SDL_SetRenderDrawColor(renderer_, cheevosBGColor.r, cheevosBGColor.g, cheevosBGColor.b, 0xFF);
SDL_RenderClear(renderer_);
// Escribe la lista de logros en la textura
const std::string cheevosOwner = "LOCAL ACHIEVEMENTS";
const std::string cheevosListCaption = cheevosOwner + " (" + std::to_string(cheevos->unlocked()) + " / " + std::to_string(cheevos->count()) + ")";
const std::string cheevosListCaption = cheevosOwner + " (" + std::to_string(cheevos_->unlocked()) + " / " + std::to_string(cheevos_->count()) + ")";
int pos = 2;
infoText->writeDX(TXT_CENTER | TXT_COLOR, cheevosTexture->getWidth() / 2, pos, cheevosListCaption, 1, stringToColor(options->palette, "bright_green"));
pos += infoText->getCharacterSize();
const color_t cheevoLockedColor = stringToColor(options->palette, "white");
const color_t cheevoUnlockedColor = stringToColor(options->palette, "bright_green");
info_text_->writeDX(TXT_CENTER | TXT_COLOR, cheevos_texture_->getWidth() / 2, pos, cheevosListCaption, 1, stringToColor(options_->palette, "bright_green"));
pos += info_text_->getCharacterSize();
const color_t cheevoLockedColor = stringToColor(options_->palette, "white");
const color_t cheevoUnlockedColor = stringToColor(options_->palette, "bright_green");
color_t cheevoColor;
SDL_SetRenderDrawColor(renderer, cheevoLockedColor.r, cheevoLockedColor.g, cheevoLockedColor.b, 0xFF);
SDL_SetRenderDrawColor(renderer_, cheevoLockedColor.r, cheevoLockedColor.g, cheevoLockedColor.b, 0xFF);
const int lineX1 = (cheevosTextureWidth / 7) * 3;
const int lineX2 = lineX1 + ((cheevosTextureWidth / 7) * 1);
@@ -492,23 +483,23 @@ void Title::createCheevosTexture()
cheevoColor = cheevo.completed ? cheevoUnlockedColor : cheevoLockedColor;
pos += cheevosPadding;
int half = cheevosPadding / 2;
SDL_RenderDrawLine(renderer, lineX1, pos - half - 1, lineX2, pos - half - 1);
infoText->writeDX(TXT_CENTER | TXT_COLOR, cheevosTextureWidth / 2, pos, cheevo.caption, 1, cheevoColor);
pos += infoText->getCharacterSize() + 1;
infoText->writeDX(TXT_CENTER | TXT_COLOR, cheevosTextureWidth / 2, pos, cheevo.description, 1, cheevoColor);
pos += infoText->getCharacterSize();
SDL_RenderDrawLine(renderer_, lineX1, pos - half - 1, lineX2, pos - half - 1);
info_text_->writeDX(TXT_CENTER | TXT_COLOR, cheevosTextureWidth / 2, pos, cheevo.caption, 1, cheevoColor);
pos += info_text_->getCharacterSize() + 1;
info_text_->writeDX(TXT_CENTER | TXT_COLOR, cheevosTextureWidth / 2, pos, cheevo.description, 1, cheevoColor);
pos += info_text_->getCharacterSize();
}
// Crea el sprite para el listado de logros
cheevosSprite = new Sprite((GAMECANVAS_WIDTH - cheevosTexture->getWidth()) / 2, cheevosTexturePosY, cheevosTexture->getWidth(), cheevosTexture->getHeight(), cheevosTexture, renderer);
cheevosTextureView = {0, 0, cheevosTexture->getWidth(), cheevosTextureViewHeight};
cheevosSprite->setSpriteClip(cheevosTextureView);
cheevos_sprite_ = new Sprite((GAMECANVAS_WIDTH - cheevos_texture_->getWidth()) / 2, cheevosTexturePosY, cheevos_texture_->getWidth(), cheevos_texture_->getHeight(), cheevos_texture_, renderer_);
cheevos_texture_view_ = {0, 0, cheevos_texture_->getWidth(), cheevosTextureViewHeight};
cheevos_sprite_->setSpriteClip(cheevos_texture_view_);
}
// Oculta la lista de logros
void Title::hideCheevosList()
{
showCheevos = false;
cheevosTextureView.y = 0;
cheevosSprite->setSpriteClip(cheevosTextureView);
show_cheevos_ = false;
cheevos_texture_view_.y = 0;
cheevos_sprite_->setSpriteClip(cheevos_texture_view_);
}

View File

@@ -6,7 +6,8 @@
#include <SDL2/SDL_stdinc.h> // Para Uint32
#include <string> // Para basic_string, string
#include <vector> // Para vector
#include "paleta.h" // Para jSurface
#include <memory>
#include "paleta.h" // Para jSurface
class Asset;
class Cheevos;
class Input;
@@ -36,34 +37,33 @@ private:
};
// Objetos y punteros
SDL_Renderer *renderer; // El renderizador de la ventana
Screen *screen; // Objeto encargado de dibujar en pantalla
Resource *resource; // Objeto con los recursos
Asset *asset; // Objeto con los ficheros de recursos
Input *input; // Objeto pata gestionar la entrada
SDL_Event *eventHandler; // Manejador de eventos
Texture *texture; // Textura con los graficos
Sprite *sprite; // Sprite para manejar la textura
SDL_Texture *bgTexture; // Textura para dibujar el fondo de la pantalla
Text *text; // Objeto para escribir texto en pantalla
Text *infoText; // Objeto para escribir texto en pantalla
options_t *options; // Puntero a las opciones del juego
Texture *cheevosTexture; // Textura con lo lista de logros
Sprite *cheevosSprite; // Sprite para manejar la textura con la lista de logros
Cheevos *cheevos; // Objeto encargado de gestionar los logros del juego
section_t *section; // Estado del bucle principal para saber si continua o se sale
SDL_Renderer *renderer_; // El renderizador de la ventana
Screen *screen_; // Objeto encargado de dibujar en pantalla
Resource *resource_; // Objeto con los recursos
Input *input_; // Objeto pata gestionar la entrada
SDL_Event *event_handler_; // Manejador de eventos
Texture *texture_; // Textura con los graficos
Sprite *sprite_; // Sprite para manejar la textura
SDL_Texture *bg_texture_; // Textura para dibujar el fondo de la pantalla
Text *text_; // Objeto para escribir texto en pantalla
Text *info_text_; // Objeto para escribir texto en pantalla
options_t *options_; // Puntero a las opciones del juego
Texture *cheevos_texture_; // Textura con la lista de logros
Sprite *cheevos_sprite_; // Sprite para manejar la textura con la lista de logros
std::unique_ptr<Cheevos> cheevos_; // Objeto encargado de gestionar los logros del juego
section_t *section_; // Estado del bucle principal para saber si continua o se sale
// Variables
int counter; // Contador
std::string longText; // Texto que aparece en la parte inferior del titulo
Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
std::vector<letter_t> letters; // Vector con las letras de la marquesina
int marqueeSpeed; // Velocidad de desplazamiento de la marquesina
bool showCheevos; // Indica si se muestra por pantalla el listado de logros
SDL_Rect cheevosTextureView; // Zona visible de la textura con el listado de logros
states_e state; // Estado en el que se encuentra el bucle principal
jSurface loading_screen; // Surface con los gráficos de la pantalla de carga
int counter_ = 0; // Contador
std::string long_text_; // Texto que aparece en la parte inferior del titulo
Uint32 ticks_ = 0; // Contador de ticks para ajustar la velocidad del programa
Uint32 ticks_speed_ = 15; // Velocidad a la que se repiten los bucles del programa
std::vector<letter_t> letters_; // Vector con las letras de la marquesina
int marquee_speed_ = 3; // Velocidad de desplazamiento de la marquesina
bool show_cheevos_ = false; // Indica si se muestra por pantalla el listado de logros
SDL_Rect cheevos_texture_view_; // Zona visible de la textura con el listado de logros
states_e state_; // Estado en el que se encuentra el bucle principal
jSurface loading_screen_; // Surface con los gráficos de la pantalla de carga
// Actualiza las variables
void update();
@@ -109,7 +109,7 @@ private:
public:
// Constructor
Title(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);
Title(SDL_Renderer *renderer, Screen *screen, Resource *resource, Input *input, options_t *options, section_t *section);
// Destructor
~Title();

View File

@@ -1,4 +1,5 @@
#include "utils.h"
#include <filesystem> // Para path
#include <stdlib.h> // Para free, malloc, abs
#include <cmath> // Para round, abs
@@ -586,4 +587,17 @@ std::string toUpper(std::string str)
std::string result(upper);
free(upper);
return result;
}
// Obtiene el nombre de un fichero a partir de una ruta completa
std::string getFileName(const std::string &path)
{
return std::filesystem::path(path).filename().string();
}
// Obtiene la ruta eliminando el nombre del fichero
std::string getPath(const std::string &full_path)
{
std::filesystem::path path(full_path);
return path.parent_path().string();
}

View File

@@ -193,4 +193,10 @@ bool colorAreEqual(color_t color1, color_t color2);
std::string toLower(std::string str);
// Convierte una cadena a mayúsculas
std::string toUpper(std::string str);
std::string toUpper(std::string str);
// Obtiene el nombre de un fichero a partir de una ruta
std::string getFileName(const std::string &path);
// Obtiene la ruta eliminando el nombre del fichero
std::string getPath(const std::string &full_path);