Ya empieza a pintar el mapa

This commit is contained in:
2022-08-11 21:13:51 +02:00
parent 89a43b3529
commit 5ec9cc4fc2
12 changed files with 415 additions and 28 deletions

View File

@@ -1,12 +1,212 @@
#include "map.h"
// Constructor
Map::Map()
Map::Map(std::string file, SDL_Renderer *renderer, Asset *asset)
{
// Copia los punteros a objetos
this->asset = asset;
this->renderer = renderer;
// Crea los objetos
texture_tile = new LTexture();
texture_bg = new LTexture();
load(file);
loadTextureFromFile(texture_tile, asset->get(tileset_img), renderer);
loadTextureFromFile(texture_bg, asset->get(bg_img), renderer);
// 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());
// Pinta el mapa de la habitación en la textura
fillMapTexture();
}
// Destructor
Map::~Map()
{
// Reclama la memoria utilizada por los objetos
texture_tile->unload();
delete texture_tile;
texture_bg->unload();
delete texture_bg;
SDL_DestroyTexture(map_texture);
}
// Carga las variables desde un fichero
bool Map::load(std::string file_path)
{
// Indicador de éxito en la carga
bool success = true;
std::string filename = file_path.substr(file_path.find_last_of("\\/") + 1);
std::string line;
std::ifstream file(file_path);
// El fichero se puede abrir
if (file.good())
{
// Procesa el fichero linea a linea
printf("Reading file %s\n", filename.c_str());
while (std::getline(file, line))
{
// Si la linea contiene el texto [tilemap] se realiza el proceso de carga del fichero tmx
if (line == "[tilemap]")
{
do
{
std::getline(file, line);
if (line.find(".tmx") != std::string::npos)
{
std::ifstream file2(asset->get(line)); // Abre el fichero tmx
if (file2.good())
{
bool data_read = false;
while (std::getline(file2, line)) // Lee el fichero linea a linea
{
if (!data_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
data_read = true;
std::getline(file2, line);
if (line != "</data>")
{
std::stringstream ss(line);
std::string tmp;
while (getline(ss, tmp, ','))
{
tilemap.push_back(std::stoi(tmp));
}
}
} while (line != "</data>");
}
}
}
}
} while (line != "[tilemap-end]");
}
// En caso contrario se parsea el fichero para buscar las variables y los valores
else
{
// Encuentra la posición del caracter '='
int pos = line.find("=");
// Procesa las dos subcadenas
if (!setVars(line.substr(0, pos), line.substr(pos + 1, line.length())))
{
printf("Warning: file %s, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str());
success = false;
}
}
}
// Cierra el fichero
printf("Closing file %s\n", filename.c_str());
file.close();
}
// El fichero no se puede abrir
else
{
printf("Warning: Unable to open %s file\n", filename.c_str());
success = false;
}
return success;
}
// Asigna variables a partir de dos cadenas
bool Map::setVars(std::string var, std::string value)
{
// Indicador de éxito en la asignación
bool success = true;
if (var == "bg_img")
{
bg_img = value;
}
else if (var == "tileset_img")
{
tileset_img = value;
}
else if (var == "room_up")
{
room_up = value;
}
else if (var == "room_down")
{
room_down = value;
}
else if (var == "room_left")
{
room_left = value;
}
else if (var == "room_right")
{
room_right = value;
}
else if (var == "tilemap")
{
// Se introducen los valores separados por comas en un vector
std::stringstream ss(value);
std::string tmp;
while (getline(ss, tmp, ','))
{
tilemap.push_back(std::stoi(tmp));
}
}
else if (var == "")
{
}
else
{
success = false;
}
return success;
}
// 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, 0x00);
SDL_RenderClear(renderer);
const int tile_size = 16;
const int map_width_in_tiles = 20;
const int map_height_in_tiles = 13;
SDL_Rect clip = {0, 0, tile_size, tile_size};
for (int y = 0; y < map_height_in_tiles; y++)
for (int x = 0; x < map_width_in_tiles; x++)
{
clip.x = ((tilemap[(y * map_width_in_tiles) + x] - 1) % 16) * tile_size;
clip.y = ((tilemap[(y * map_width_in_tiles) + x] - 1) / 16) * tile_size;
texture_tile->render(renderer, x * tile_size, y * tile_size, &clip);
}
SDL_SetRenderTarget(renderer, nullptr);
}
// Dibuja el mapa en pantalla
void Map::render()
{
// Dibuja el fondo
// Dibuja la textura con el mapa en pantalla
SDL_Rect rect = {0, 0, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT};
SDL_RenderCopy(renderer, map_texture, &rect, NULL);
}