Añadida la capa de fondo al mapa
This commit is contained in:
162
source/map.cpp
162
source/map.cpp
@@ -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)
|
||||
{
|
||||
|
||||
39
source/map.h
39
source/map.h
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user