Añadidos los enemigos

This commit is contained in:
2022-08-20 20:49:35 +02:00
parent 82089bb780
commit 6d2fe4541a
17 changed files with 393 additions and 57 deletions

View File

@@ -35,6 +35,12 @@ Map::~Map()
delete texture_tile;
SDL_DestroyTexture(map_texture);
for (auto enemy : enemy_list)
{
delete enemy;
}
enemy_list.clear();
}
// Carga las variables desde un fichero
@@ -95,7 +101,32 @@ bool Map::load(std::string file_path)
}
}
}
} while (line != "[tilemap-end]");
} while (line != "[/tilemap]");
}
// Si la linea contiene el texto [enemy] se realiza el proceso de carga de un enemigo
else if (line == "[enemy]")
{
enemy_t enemy;
enemy.asset = asset;
enemy.renderer = renderer;
do
{
std::getline(file, line);
// Encuentra la posición del caracter '='
int pos = line.find("=");
// Procesa las dos subcadenas
if (!setEnemy(&enemy, line.substr(0, pos), line.substr(pos + 1, line.length())))
{
printf("Warning: file %s\n, unknown parameter \"%s\"\n", filename.c_str(), line.substr(0, pos).c_str());
success = false;
}
} while (line != "[/enemy]");
// Añade el enemigo al vector de enemigos
enemy_list.push_back(new Enemy(enemy));
}
// En caso contrario se parsea el fichero para buscar las variables y los valores
@@ -163,6 +194,71 @@ bool Map::setVars(std::string var, std::string value)
return success;
}
// Asigna variables a una estructura enemy_t
bool Map::setEnemy(enemy_t *enemy, std::string var, std::string value)
{
// Indicador de éxito en la asignación
bool success = true;
if (var == "tileset")
{
enemy->tileset = value;
}
else if (var == "animation")
{
enemy->animation = value;
}
else if (var == "width")
{
enemy->w = std::stof(value);
}
else if (var == "height")
{
enemy->h = std::stof(value);
}
else if (var == "x")
{
enemy->x = std::stof(value) * tile_size;
}
else if (var == "y")
{
enemy->y = std::stof(value) * tile_size;
}
else if (var == "vx")
{
enemy->vx = std::stof(value);
}
else if (var == "vy")
{
enemy->vy = std::stof(value);
}
else if (var == "x1")
{
enemy->x1 = std::stoi(value) * tile_size;
}
else if (var == "x2")
{
enemy->x2 = std::stoi(value) * tile_size;
}
else if (var == "y1")
{
enemy->y1 = std::stoi(value) * tile_size;
}
else if (var == "y2")
{
enemy->y2 = std::stoi(value) * tile_size;
}
else if (var == "[/enemy]")
{
}
else
{
success = false;
}
return success;
}
// Crea la textura con el mapeado de la habitación
void Map::fillMapTexture()
{
@@ -208,13 +304,14 @@ void Map::fillMapTexture()
}
// 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);
// 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);
// Vuelve a colocar el renderizador
SDL_SetRenderTarget(renderer, nullptr);
}
@@ -224,24 +321,44 @@ 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);
for (auto enemy : enemy_list)
{
enemy->render();
}
}
// Actualiza todas las variables
void Map::update()
{
for (auto enemy : enemy_list)
{
enemy->update();
}
}
// Devuelve el tipo de tile que hay en un punto
e_tile_map Map::getTile(SDL_Point p)
{
const int x = std::max(getPlayArea(b_left), (std::min(p.x, getPlayArea(b_right))));
const int y = std::max(getPlayArea(b_top), (std::min(p.y, getPlayArea(b_bottom))));
// Normalizamos los puntos para que no busque fuera del mapa
const int x = std::max(getPlayArea(b_left), (std::min(p.x, getPlayArea(b_right) - 1)));
const int y = std::max(getPlayArea(b_top), (std::min(p.y, getPlayArea(b_bottom) - 1)));
// Calcula el tile
const int tile = tilemap[((y / tile_size) * map_width) + (x / tile_size)];
const int png_width = 32;
// Las 8 primeras filas son tiles de fondo
if (tile >= 0 && tile < 8 * png_width)
{
return nothing;
}
// De la fila 8 a la 15 hay tiles de muro
else if (tile >= (8 * png_width) && tile < 16 * png_width)
{
return wall;
}
// A partir de la fila 16 son tiles atravesables
else
{
return passable;