Trabajando en la recarga de recursos

This commit is contained in:
2022-11-07 19:13:58 +01:00
parent 8ae821733c
commit a36378f98c
15 changed files with 95 additions and 38 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -27,6 +27,15 @@ void Resource::loadTextures(std::vector<std::string> list)
} }
} }
// Vuelve a cargar las texturas
void Resource::reLoadTextures()
{
for (auto texture : textures)
{
texture.texture->reLoad();
}
}
// Carga las animaciones desde una lista // Carga las animaciones desde una lista
void Resource::loadAnimations(std::vector<std::string> list) void Resource::loadAnimations(std::vector<std::string> list)
{ {
@@ -50,6 +59,21 @@ void Resource::loadAnimations(std::vector<std::string> list)
} }
} }
// Vuelve a cargar las animaciones
void Resource::reLoadAnimations()
{
reLoadTextures();
for (auto a:animations)
{
// Extrae el nombre del fichero sin la extension para crear el nombre del fichero de la textura
const size_t lastIndex = a.name.find_last_of(".");
const std::string pngFile = a.name.substr(0, lastIndex) + ".png";
delete a.animation;
a.animation = new animatedSprite_t(loadAnimationFromFile(getTexture(pngFile), asset->get(a.name), options->console));
}
}
// Carga los offsets desde una lista // Carga los offsets desde una lista
void Resource::loadOffsets(std::vector<std::string> list) void Resource::loadOffsets(std::vector<std::string> list)
{ {
@@ -62,6 +86,16 @@ void Resource::loadOffsets(std::vector<std::string> list)
} }
} }
// Vuelve a cargar los offsets
void Resource::reLoadOffsets()
{
for (auto o:offsets)
{
delete o.textFile;
o.textFile = new textFile_t(LoadTextFile(asset->get(o.name), options->console));
}
}
// Carga los mapas de tiles desde una lista // Carga los mapas de tiles desde una lista
void Resource::loadTileMaps(std::vector<std::string> list) void Resource::loadTileMaps(std::vector<std::string> list)
{ {
@@ -74,6 +108,16 @@ void Resource::loadTileMaps(std::vector<std::string> list)
} }
} }
// Vuelve a cargar los mapas de tiles
void Resource::reLoadTileMaps()
{
for (auto tm:tileMaps)
{
delete tm.tileMap;
tm.tileMap = new std::vector<int>(loadRoomTileFile(asset->get(tm.name), options->console));
}
}
// Carga las habitaciones desde una lista // Carga las habitaciones desde una lista
void Resource::loadRooms(std::vector<std::string> list) void Resource::loadRooms(std::vector<std::string> list)
{ {
@@ -97,18 +141,11 @@ void Resource::loadRooms(std::vector<std::string> list)
} }
} }
// Recarga las texturas // Vuelve a cargar las habitaciones
void Resource::reLoadTextures()
{
for (auto texture : textures)
{
texture.texture->reLoad();
}
}
// Recarga las habitaciones
void Resource::reLoadRooms() void Resource::reLoadRooms()
{ {
reLoadTileMaps();
for (auto r : rooms) for (auto r : rooms)
{ {
delete r.room; delete r.room;
@@ -127,6 +164,14 @@ void Resource::reLoadRooms()
} }
} }
// Vuelve a cargar todos los recursos
void Resource::reLoad()
{
reLoadAnimations();
reLoadOffsets();
reLoadRooms();
}
// Libera las texturas // Libera las texturas
void Resource::freeTextures() void Resource::freeTextures()
{ {

View File

@@ -66,24 +66,36 @@ public:
// Carga las texturas de una lista // Carga las texturas de una lista
void loadTextures(std::vector<std::string> list); void loadTextures(std::vector<std::string> list);
// Vuelve a cargar las texturas
void reLoadTextures();
// Carga las animaciones desde una lista // Carga las animaciones desde una lista
void loadAnimations(std::vector<std::string> list); void loadAnimations(std::vector<std::string> list);
// Vuelve a cargar las animaciones
void reLoadAnimations();
// Carga los offsets desde una lista // Carga los offsets desde una lista
void loadOffsets(std::vector<std::string> list); void loadOffsets(std::vector<std::string> list);
// Vuelve a cargar los offsets
void reLoadOffsets();
// Carga los mapas de tiles desde una lista // Carga los mapas de tiles desde una lista
void loadTileMaps(std::vector<std::string> list); void loadTileMaps(std::vector<std::string> list);
// Vuelve a cargar los mapas de tiles
void reLoadTileMaps();
// Carga las habitaciones desde una lista // Carga las habitaciones desde una lista
void loadRooms(std::vector<std::string> list); void loadRooms(std::vector<std::string> list);
// Recarga las texturas // Vuelve a cargar las habitaciones
void reLoadTextures();
// Recarga las habitaciones
void reLoadRooms(); void reLoadRooms();
// Vuelve a cargar todos los recursos
void reLoad();
// Libera las texturas // Libera las texturas
void freeTextures(); void freeTextures();

View File

@@ -101,7 +101,7 @@ void Game::checkEventHandler()
break; break;
case SDL_SCANCODE_R: case SDL_SCANCODE_R:
resource->reLoadRooms(); resource->reLoad();
break; break;
case SDL_SCANCODE_M: case SDL_SCANCODE_M:

View File

@@ -402,7 +402,7 @@ Room::Room(room_t *room, SDL_Renderer *renderer, Screen *screen, Asset *asset, o
autoSurfaceDirection = room->autoSurfaceDirection; autoSurfaceDirection = room->autoSurfaceDirection;
textureA = room->textureA; textureA = room->textureA;
textureB = room->textureB; textureB = room->textureB;
tileMap = room->tileMap; tileMap = *room->tileMap;
texture = (options->palette == p_zxspectrum) ? textureA : textureB; texture = (options->palette == p_zxspectrum) ? textureA : textureB;
this->jailEnabled = jailEnabled; this->jailEnabled = jailEnabled;
@@ -533,13 +533,13 @@ void Room::fillMapTexture()
// Al cargar el mapa en memoria, se resta uno, por tanto los tiles vacios son -1 // Al cargar el mapa en memoria, se resta uno, por tanto los tiles vacios son -1
// Tampoco hay que dibujar los tiles animados que estan en la fila 19 (indices) // Tampoco hay que dibujar los tiles animados que estan en la fila 19 (indices)
const int index = (y * mapWidth) + x; const int index = (y * mapWidth) + x;
const bool a = (tileMap->at(index) >= 18 * tileSetWidth) && (tileMap->at(index) < 19 * tileSetWidth); const bool a = (tileMap.at(index) >= 18 * tileSetWidth) && (tileMap.at(index) < 19 * tileSetWidth);
const bool b = tileMap->at(index) > -1; const bool b = tileMap.at(index) > -1;
if (b && !a) if (b && !a)
{ {
clip.x = (tileMap->at(index) % tileSetWidth) * tileSize; clip.x = (tileMap.at(index) % tileSetWidth) * tileSize;
clip.y = (tileMap->at(index) / tileSetWidth) * tileSize; clip.y = (tileMap.at(index) / tileSetWidth) * tileSize;
texture->render(renderer, x * tileSize, y * tileSize, &clip); texture->render(renderer, x * tileSize, y * tileSize, &clip);
// **** // ****
@@ -739,37 +739,37 @@ tile_e Room::getTile(int index)
if (index < maxTile) if (index < maxTile)
{ {
// Las filas 0-8 son de tiles t_wall // Las filas 0-8 son de tiles t_wall
if ((tileMap->at(index) >= 0) && (tileMap->at(index) < 9 * tileSetWidth)) if ((tileMap.at(index) >= 0) && (tileMap.at(index) < 9 * tileSetWidth))
{ {
return t_wall; return t_wall;
} }
// Las filas 9-17 son de tiles t_passable // Las filas 9-17 son de tiles t_passable
else if ((tileMap->at(index) >= 9 * tileSetWidth) && (tileMap->at(index) < 18 * tileSetWidth)) else if ((tileMap.at(index) >= 9 * tileSetWidth) && (tileMap.at(index) < 18 * tileSetWidth))
{ {
return t_passable; return t_passable;
} }
// Las filas 18-20 es de tiles t_animated // Las filas 18-20 es de tiles t_animated
else if ((tileMap->at(index) >= 18 * tileSetWidth) && (tileMap->at(index) < 21 * tileSetWidth)) else if ((tileMap.at(index) >= 18 * tileSetWidth) && (tileMap.at(index) < 21 * tileSetWidth))
{ {
return t_animated; return t_animated;
} }
// La fila 21 es de tiles t_slope_r // La fila 21 es de tiles t_slope_r
else if ((tileMap->at(index) >= 21 * tileSetWidth) && (tileMap->at(index) < 22 * tileSetWidth)) else if ((tileMap.at(index) >= 21 * tileSetWidth) && (tileMap.at(index) < 22 * tileSetWidth))
{ {
return t_slope_r; return t_slope_r;
} }
// La fila 22 es de tiles t_slope_l // La fila 22 es de tiles t_slope_l
else if ((tileMap->at(index) >= 22 * tileSetWidth) && (tileMap->at(index) < 23 * tileSetWidth)) else if ((tileMap.at(index) >= 22 * tileSetWidth) && (tileMap.at(index) < 23 * tileSetWidth))
{ {
return t_slope_l; return t_slope_l;
} }
// La fila 23 es de tiles t_kill // La fila 23 es de tiles t_kill
else if ((tileMap->at(index) >= 23 * tileSetWidth) && (tileMap->at(index) < 24 * tileSetWidth)) else if ((tileMap.at(index) >= 23 * tileSetWidth) && (tileMap.at(index) < 24 * tileSetWidth))
{ {
return t_kill; return t_kill;
} }
@@ -897,7 +897,7 @@ void Room::setBottomSurfaces()
// Busca todos los tiles de tipo muro que no tengan debajo otro muro // Busca todos los tiles de tipo muro que no tengan debajo otro muro
// Hay que recorrer la habitación por filas (excepto los de la última fila) // Hay que recorrer la habitación por filas (excepto los de la última fila)
for (int i = 0; i < (int)tileMap->size() - mapWidth; ++i) for (int i = 0; i < (int)tileMap.size() - mapWidth; ++i)
{ {
if (getTile(i) == t_wall && getTile(i + mapWidth) != t_wall) if (getTile(i) == t_wall && getTile(i + mapWidth) != t_wall)
{ {
@@ -960,7 +960,7 @@ void Room::setTopSurfaces()
// Busca todos los tiles de tipo muro o pasable que no tengan encima un muro // Busca todos los tiles de tipo muro o pasable que no tengan encima un muro
// Hay que recorrer la habitación por filas (excepto los de la primera fila) // Hay que recorrer la habitación por filas (excepto los de la primera fila)
for (int i = mapWidth; i < (int)tileMap->size(); ++i) for (int i = mapWidth; i < (int)tileMap.size(); ++i)
{ {
if ((getTile(i) == t_wall || getTile(i) == t_passable) && getTile(i - mapWidth) != t_wall) if ((getTile(i) == t_wall || getTile(i) == t_passable) && getTile(i - mapWidth) != t_wall)
{ {
@@ -1117,7 +1117,7 @@ void Room::setLeftSlopes()
{ {
// Recorre la habitación entera por filas buscando tiles de tipo t_slope_l // Recorre la habitación entera por filas buscando tiles de tipo t_slope_l
std::vector<int> found; std::vector<int> found;
for (int i = 0; i < (int)tileMap->size(); ++i) for (int i = 0; i < (int)tileMap.size(); ++i)
{ {
if (getTile(i) == t_slope_l) if (getTile(i) == t_slope_l)
{ {
@@ -1158,7 +1158,7 @@ void Room::setRightSlopes()
{ {
// Recorre la habitación entera por filas buscando tiles de tipo t_slope_r // Recorre la habitación entera por filas buscando tiles de tipo t_slope_r
std::vector<int> found; std::vector<int> found;
for (int i = 0; i < (int)tileMap->size(); ++i) for (int i = 0; i < (int)tileMap.size(); ++i)
{ {
if (getTile(i) == t_slope_r) if (getTile(i) == t_slope_r)
{ {
@@ -1201,7 +1201,7 @@ void Room::setAutoSurfaces()
// Busca todos los tiles de tipo animado // Busca todos los tiles de tipo animado
// Hay que recorrer la habitación por filas (excepto los de la primera fila) // Hay que recorrer la habitación por filas (excepto los de la primera fila)
for (int i = mapWidth; i < (int)tileMap->size(); ++i) for (int i = mapWidth; i < (int)tileMap.size(); ++i)
{ {
if (getTile(i) == t_animated) if (getTile(i) == t_animated)
{ {
@@ -1258,7 +1258,7 @@ void Room::setAutoSurfaces()
void Room::setAnimatedTiles() void Room::setAnimatedTiles()
{ {
// Recorre la habitación entera por filas buscando tiles de tipo t_animated // Recorre la habitación entera por filas buscando tiles de tipo t_animated
for (int i = 0; i < (int)tileMap->size(); ++i) for (int i = 0; i < (int)tileMap.size(); ++i)
{ {
if (getTile(i) == t_animated) if (getTile(i) == t_animated)
{ {
@@ -1266,9 +1266,9 @@ void Room::setAnimatedTiles()
const int x = (i % mapWidth) * tileSize; const int x = (i % mapWidth) * tileSize;
const int y = (i / mapWidth) * tileSize; const int y = (i / mapWidth) * tileSize;
// TileMap->at(i) es el tile a poner // TileMap.at(i) es el tile a poner
const int xc = (tileMap->at(i) % tileSetWidth) * tileSize; const int xc = (tileMap.at(i) % tileSetWidth) * tileSize;
const int yc = (tileMap->at(i) / tileSetWidth) * tileSize; const int yc = (tileMap.at(i) / tileSetWidth) * tileSize;
aTile_t at; aTile_t at;
at.sprite = new Sprite(x, y, 8, 8, texture, renderer); at.sprite = new Sprite(x, y, 8, 8, texture, renderer);
@@ -1499,7 +1499,7 @@ void Room::openTheJail()
// Abre las puertas // Abre las puertas
const int tileA = 16 + (13 * 32); const int tileA = 16 + (13 * 32);
const int tileB = 16 + (14 * 32); const int tileB = 16 + (14 * 32);
tileMap->at(tileA) = -1; tileMap.at(tileA) = -1;
tileMap->at(tileB) = -1; tileMap.at(tileB) = -1;
} }
} }

View File

@@ -76,7 +76,6 @@ private:
// Objetos y punteros // Objetos y punteros
std::vector<Enemy *> enemies; // Listado con los enemigos de la habitación std::vector<Enemy *> enemies; // Listado con los enemigos de la habitación
std::vector<Item *> items; // Listado con los items que hay en la habitación std::vector<Item *> items; // Listado con los items que hay en la habitación
std::vector<int> *tileMap; // Indice de los tiles a dibujar en la habitación
Texture *texture; // Textura con los graficos de la habitación Texture *texture; // Textura con los graficos de la habitación
Texture *textureA; // Textura con los graficos de la habitación Texture *textureA; // Textura con los graficos de la habitación
Texture *textureB; // Textura con los graficos de la habitación Texture *textureB; // Textura con los graficos de la habitación
@@ -101,6 +100,7 @@ private:
std::string roomRight; // Identificador de la habitación que se encuentra a la derecha std::string roomRight; // Identificador de la habitación que se encuentra a la derecha
std::string tileSetFile; // Imagen con los graficos para la habitación std::string tileSetFile; // Imagen con los graficos para la habitación
std::string tileMapFile; // Fichero con el mapa de indices de tile std::string tileMapFile; // Fichero con el mapa de indices de tile
std::vector<int> tileMap; // Indice de los tiles a dibujar en la habitación
int autoSurfaceDirection; // Sentido en el que arrastran las superficies automáticas de la habitación int autoSurfaceDirection; // Sentido en el que arrastran las superficies automáticas de la habitación
JA_Sound itemSound; // Sonido producido al coger un objeto JA_Sound itemSound; // Sonido producido al coger un objeto
std::vector<h_line_t> bottomSurfaces; // Lista con las superficies inferiores de la habitación std::vector<h_line_t> bottomSurfaces; // Lista con las superficies inferiores de la habitación