Añadidos los enemigos
This commit is contained in:
135
source/map.cpp
135
source/map.cpp
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user