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)
{

View File

@@ -35,23 +35,25 @@ enum e_border
class Map
{
private:
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
SDL_Renderer *renderer; // El renderizador de la ventana
std::string name; // Identificador de la habitación
std::string room_up; // Identificador de la habitación que se encuentra arriba
std::string room_down; // Identificador de la habitación que se encuentra abajp
std::string room_left; // Identificador de la habitación que se encuentra a la izquierda
std::string room_right; // Identificador de la habitación que se encuentra a la derecha
std::string enemy_file; // Fichero con los enemigos para la habitación
std::string tileset_img; // Imagen con los graficos para la habitación
std::vector<int> tilemap; // Indice de los tiles a dibujar en la habitación
std::vector<int> collisionmap; // Indice con los tipos de tile de la habitación
LTexture *texture_tile; // Textura con los graficos de los tiles habitación
SDL_Texture *map_texture; // Textura para dibujar el mapa de la habitación
std::vector<Actor *> actors; // Listado con los actores de la habitación
color_t bgColor1; // Color superior del degradado de fondo
color_t bgColor2; // Color inferior del degradado de fondo
ItemTracker *itemTracker; // Objeto que gestiona los items que ya se han recogido
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
SDL_Renderer *renderer; // El renderizador de la ventana
std::string name; // Identificador de la habitación
std::string room_up; // Identificador de la habitación que se encuentra arriba
std::string room_down; // Identificador de la habitación que se encuentra abajp
std::string room_left; // Identificador de la habitación que se encuentra a la izquierda
std::string room_right; // Identificador de la habitación que se encuentra a la derecha
std::string enemy_file; // Fichero con los enemigos para la habitación
std::string tileset_img; // Imagen con los graficos para la habitación
std::vector<int> tilemap_l0; // Indice de los tiles a dibujar de la capa 0 en la habitación
std::vector<int> tilemap_l1; // Indice de los tiles a dibujar de la capa 1 en la habitación
std::vector<int> collisionmap; // Indice con los tipos de tile de la habitación
LTexture *texture_tile; // Textura con los graficos de los tiles habitación
SDL_Texture *map_layer0; // Textura para dibujar la capa 0 del mapa de la habitación
SDL_Texture *map_layer1; // Textura para dibujar la capa 1 del mapa de la habitación
std::vector<Actor *> actors; // Listado con los actores de la habitación
color_t bgColor1; // Color superior del degradado de fondo
color_t bgColor2; // Color inferior del degradado de fondo
ItemTracker *itemTracker; // Objeto que gestiona los items que ya se han recogido
int tile_size; // Ancho del tile en pixels
int map_width; // Ancho del mapa en tiles
@@ -89,9 +91,6 @@ public:
// Devuelve el valor de la variable
int getTileSize();
// Devuelve el indice del tile correspondiente a un punto del mapa
int getTileIndex(SDL_Point p);
// Devuelve el valor de los bordes de la zona de juego
int getPlayArea(e_border border);