Añadida la capa de fondo al mapa

This commit is contained in:
2022-09-21 21:06:09 +02:00
parent 5f99fe3550
commit 488e603ca5
8 changed files with 324 additions and 133 deletions

View File

@@ -21,10 +21,14 @@ Map::Map(std::string file, SDL_Renderer *renderer, Asset *asset, ItemTracker *it
texture_tile = new LTexture(renderer, asset->get(tileset_img));
tileset_width = texture_tile->getWidth() / tile_size;
// Crea la textura para el mapa de tiles de la habitación
map_texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT);
if (map_texture == NULL)
printf("Error: map_texture could not be created!\nSDL Error: %s\n", SDL_GetError());
// Crea las texturas para dibujar el mapa
map_layer0 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT);
if (map_layer0 == NULL)
printf("Error: map_layer0 could not be created!\nSDL Error: %s\n", SDL_GetError());
map_layer1 = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT);
if (map_layer1 == NULL)
printf("Error: map_layer1 could not be created!\nSDL Error: %s\n", SDL_GetError());
// Pinta el mapa de la habitación en la textura
fillMapTexture();
@@ -37,7 +41,7 @@ Map::~Map()
texture_tile->unload();
delete texture_tile;
SDL_DestroyTexture(map_texture);
SDL_DestroyTexture(map_layer1);
for (auto actor : actors)
{
@@ -74,11 +78,12 @@ bool Map::load(std::string file_path)
std::ifstream file2(asset->get(line)); // Abre el fichero tmx
if (file2.good())
{
bool map1_read = false;
bool map2_read = false;
bool map_col_read = false;
bool map_l0_read = false;
bool map_l1_read = false;
while (std::getline(file2, line)) // Lee el fichero linea a linea
{
if (!map1_read)
if (!map_l0_read)
{ // Lee lineas hasta que encuentre donde empiezan los datos del mapa
int pos = 0;
do
@@ -89,7 +94,7 @@ bool Map::load(std::string file_path)
do
{ // Se introducen los valores separados por comas en un vector
map1_read = true;
map_l0_read = true;
std::getline(file2, line);
if (line != "</data>")
{
@@ -97,12 +102,13 @@ bool Map::load(std::string file_path)
std::string tmp;
while (getline(ss, tmp, ','))
{
tilemap.push_back(std::stoi(tmp));
tilemap_l0.push_back(std::stoi(tmp));
}
}
} while (line != "</data>");
}
if (!map2_read)
if (!map_l1_read)
{ // Lee lineas hasta que encuentre donde empiezan los datos del mapa
int pos = 0;
do
@@ -113,7 +119,32 @@ bool Map::load(std::string file_path)
do
{ // Se introducen los valores separados por comas en un vector
map2_read = true;
map_l1_read = true;
std::getline(file2, line);
if (line != "</data>")
{
std::stringstream ss(line);
std::string tmp;
while (getline(ss, tmp, ','))
{
tilemap_l1.push_back(std::stoi(tmp));
}
}
} while (line != "</data>");
}
if (!map_col_read)
{ // Lee lineas hasta que encuentre donde empiezan los datos del mapa
int pos = 0;
do
{
std::getline(file2, line);
pos = line.find("data encoding");
} while (pos == std::string::npos);
do
{ // Se introducen los valores separados por comas en un vector
map_col_read = true;
std::getline(file2, line);
if (line != "</data>")
{
@@ -365,54 +396,70 @@ bool Map::setActor(actor_t *actor, SDL_Point *p1, SDL_Point *p2, std::string var
// Crea la textura con el mapeado de la habitación
void Map::fillMapTexture()
{
SDL_SetRenderTarget(renderer, map_texture);
SDL_SetTextureBlendMode(map_texture, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
// Dibuja el degradado de fondo
const int num_lines = 208;
for (int i = 0; i < num_lines; i++)
{
float step = ((float)i / (float)num_lines);
int r = bgColor1.r + ((bgColor2.r - bgColor1.r) * step);
int g = bgColor1.g + ((bgColor2.g - bgColor1.g) * step);
int b = bgColor1.b + ((bgColor2.b - bgColor1.b) * step);
SDL_SetRenderDrawColor(renderer, r, g, b, 0xFF);
SDL_RenderDrawLine(renderer, 0, i, 319, i);
}
// Dibuja el mapeado de tiles
// Crea variables
SDL_Rect clip = {0, 0, tile_size, tile_size};
for (int y = 0; y < map_height; y++)
for (int x = 0; x < map_width; x++)
// Rellena la capa 0
{
SDL_SetRenderTarget(renderer, map_layer0);
SDL_SetTextureBlendMode(map_layer0, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
SDL_RenderClear(renderer);
// Dibuja el degradado de fondo
const int num_lines = 208;
for (int i = 0; i < num_lines; i++)
{
// Resta uno porque Tiled almacena los indices empezando de 1 en vez de 0.
// El problema es que los tiles vacios los pone como 0 y aqui pasan a ser -1
// con lo que esta pintando desde fuera de la textura
clip.x = ((tilemap[(y * map_width) + x] - 1) % tileset_width) * tile_size;
clip.y = ((tilemap[(y * map_width) + x] - 1) / tileset_width) * tile_size;
texture_tile->render(renderer, x * tile_size, y * tile_size, &clip);
float step = ((float)i / (float)num_lines);
int r = bgColor1.r + ((bgColor2.r - bgColor1.r) * step);
int g = bgColor1.g + ((bgColor2.g - bgColor1.g) * step);
int b = bgColor1.b + ((bgColor2.b - bgColor1.b) * step);
SDL_SetRenderDrawColor(renderer, r, g, b, 0xFF);
SDL_RenderDrawLine(renderer, 0, i, 319, i);
}
// Dibuja el degradado del marcador
int color = 105;
for (int i = 208; i < 240; i++)
{
SDL_SetRenderDrawColor(renderer, 0x69, color, 0x69, 0xFF);
SDL_RenderDrawLine(renderer, 0, i, 320, i);
color--;
// Dibuja el mapeado de tiles
for (int y = 0; y < map_height; y++)
for (int x = 0; x < map_width; x++)
{
// Resta uno porque Tiled almacena los indices empezando de 1 en vez de 0.
// El problema es que los tiles vacios los pone como 0 y aqui pasan a ser -1
// con lo que esta pintando desde fuera de la textura
clip.x = ((tilemap_l0[(y * map_width) + x] - 1) % tileset_width) * tile_size;
clip.y = ((tilemap_l0[(y * map_width) + x] - 1) / tileset_width) * tile_size;
texture_tile->render(renderer, x * tile_size, y * tile_size, &clip);
}
// Dibuja el degradado del marcador
int color = 105;
for (int i = 208; i < 240; i++)
{
SDL_SetRenderDrawColor(renderer, 0x69, color, 0x69, 0xFF);
SDL_RenderDrawLine(renderer, 0, i, 320, i);
color--;
}
}
// Dibuja el marco del marcador
// SDL_SetRenderDrawColor(renderer, 85, 50, 85, 0xFF);
// SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xFF);
// SDL_Rect rect = {0, 208, 320, 32};
// SDL_RenderDrawRect(renderer, &rect);
// rect = {1, 209, 318, 30};
// SDL_RenderDrawRect(renderer, &rect);
// Rellena la capa 1
{
SDL_SetRenderTarget(renderer, map_layer1);
SDL_SetTextureBlendMode(map_layer1, SDL_BLENDMODE_BLEND);
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
SDL_RenderClear(renderer);
// Dibuja el mapeado de tiles
for (int y = 0; y < map_height; y++)
for (int x = 0; x < map_width; x++)
{
// Resta uno porque Tiled almacena los indices empezando de 1 en vez de 0.
// El problema es que los tiles vacios los pone como 0 y aqui pasan a ser -1
// con lo que esta pintando desde fuera de la textura
clip.x = ((tilemap_l1[(y * map_width) + x] - 1) % tileset_width) * tile_size;
clip.y = ((tilemap_l1[(y * map_width) + x] - 1) / tileset_width) * tile_size;
texture_tile->render(renderer, x * tile_size, y * tile_size, &clip);
}
}
// Vuelve a colocar el renderizador
SDL_SetRenderTarget(renderer, nullptr);
@@ -423,7 +470,8 @@ void Map::render()
{
// Dibuja la textura con el mapa en pantalla
SDL_Rect rect = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
SDL_RenderCopy(renderer, map_texture, &rect, NULL);
SDL_RenderCopy(renderer, map_layer0, &rect, NULL);
SDL_RenderCopy(renderer, map_layer1, &rect, NULL);
for (auto actor : actors)
{
@@ -475,12 +523,6 @@ int Map::getTileSize()
return tile_size;
}
// Devuelve el indice del tile correspondiente a un punto del mapa
int Map::getTileIndex(SDL_Point p)
{
return tilemap[((p.y / tile_size) * map_width) + (p.x / tile_size)];
}
// Devuelve el valor de los bordes de la zona de juego
int Map::getPlayArea(e_border border)
{