Ahora si, terminado el calculo de superficies

This commit is contained in:
2022-09-08 10:22:52 +02:00
parent 044cf97857
commit 9fc4c2d8b0
4 changed files with 50 additions and 39 deletions

View File

@@ -437,38 +437,51 @@ void Room::fillMapTexture()
{
clip.x = ((tilemap[(y * 32) + x] - 1) % 20) * 8;
clip.y = ((tilemap[(y * 32) + x] - 1) / 20) * 8;
texture->render(renderer, x * 8, y * 8, &clip);
// texture->render(renderer, x * 8, y * 8, &clip);
if (debug->getEnabled())
{
if (clip.x != -8)
{
clip.x = x * 8;
clip.y = y * 8;
SDL_SetRenderDrawColor(renderer, 32, 32, 32, 0xFF);
SDL_RenderFillRect(renderer, &clip);
}
}
}
// ****
if (debug->getEnabled())
{
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
for (auto l : bottomSurfaces)
{
SDL_SetRenderDrawColor(renderer, (rand() % 128) + 80, (rand() % 128) + 80, (rand() % 128) + 80, 0xFF);
SDL_RenderDrawLine(renderer, l.x1, l.y, l.x2, l.y);
}
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
for (auto l : topSurfaces)
{
SDL_SetRenderDrawColor(renderer, (rand() % 128) + 80, (rand() % 128) + 80, (rand() % 128) + 80, 0xFF);
SDL_RenderDrawLine(renderer, l.x1, l.y, l.x2, l.y);
}
SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF);
for (auto l : leftSurfaces)
{
SDL_SetRenderDrawColor(renderer, (rand() % 128) + 80, (rand() % 128) + 80, (rand() % 128) + 80, 0xFF);
SDL_RenderDrawLine(renderer, l.x, l.y1, l.x, l.y2);
}
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
for (auto l : rightSurfaces)
{
SDL_SetRenderDrawColor(renderer, (rand() % 128)+80, (rand() % 128)+80, (rand() % 128)+80, 0xFF);
SDL_RenderDrawLine(renderer, l.x, l.y1, l.x, l.y2);
}
}
// ****
SDL_SetRenderTarget(renderer, nullptr);
}
@@ -703,8 +716,8 @@ void Room::setBottomSurfaces()
{
std::vector<int> tile;
// Busca todos los tiles de tipo wall (excepto los de la última fila) que debajo
// tienen un tile de tipo vacio
// Busca todos los tiles de tipo muro que no tengan debajo otro muro
// Hay que recorrer la habitación por filas (excepto los de la última fila)
for (int i = 0; i < tilemap.size() - mapWidth; i++)
{
if (getTile(i) == t_wall && getTile(i + mapWidth) != t_wall)
@@ -730,10 +743,6 @@ void Room::setBottomSurfaces()
while (tile[i] + 1 == tile[i + 1])
{
i++;
if (i % mapWidth == mapWidth - 1)
{
break;
}
}
line.x2 = ((tile[i] % mapWidth) * tileSize) + tileSize - 1;
bottomSurfaces.push_back(line);
@@ -746,8 +755,8 @@ void Room::setTopSurfaces()
{
std::vector<int> tile;
// Busca todos los tiles de tipo wall (excepto los de la primera fila) que encima
// tienen un tile de tipo vacio
// Busca todos los tiles de tipo muro o pasable que no tengan encima un muro
// Hay que recorrer la habitación por filas (excepto los de la primera fila)
for (int i = mapWidth; i < tilemap.size(); i++)
{
if ((getTile(i) == t_wall || getTile(i) == t_passable) && getTile(i - mapWidth) != t_wall)
@@ -772,10 +781,6 @@ void Room::setTopSurfaces()
while (tile[i] + 1 == tile[i + 1])
{
i++;
if (i % mapWidth == mapWidth - 1)
{
break;
}
}
line.x2 = ((tile[i] % mapWidth) * tileSize) + tileSize - 1;
topSurfaces.push_back(line);
@@ -788,20 +793,23 @@ void Room::setLeftSurfaces()
{
std::vector<int> tile;
// Busca todos los tiles de tipo wall (excepto los de la primera columna) que a su izquierda
// tienen un tile de tipo vacio
for (int i = 0; i < tilemap.size(); i++)
// Busca todos los tiles de tipo muro que no tienen a su izquierda un tile de tipo muro
// Hay que recorrer la habitación por columnas (excepto los de la primera columna)
for (int i = 1; i < mapWidth; ++i)
{
if (i % mapWidth != 0)
for (int j = 0; j < mapHeight; ++j)
{
if (getTile(i) == t_wall && getTile(i - 1) != t_wall)
const int pos = (j * mapWidth + i);
if (getTile(pos) == t_wall && getTile(pos - 1) != t_wall)
{
tile.push_back(i);
tile.push_back(pos);
}
}
}
// Recorre el vector de tiles buscando tiles consecutivos para localizar las superficies
// Recorre el vector de tiles buscando tiles consecutivos
// (Los tiles de la misma columna, la diferencia entre ellos es de mapWidth)
// para localizar las superficies
int i = 0;
while (i < tile.size())
{
@@ -823,20 +831,23 @@ void Room::setRightSurfaces()
{
std::vector<int> tile;
// Busca todos los tiles de tipo wall (excepto los de la ultima columna) que a su derecha
// tienen un tile de tipo vacio
for (int i = 0; i < tilemap.size(); i++)
// Busca todos los tiles de tipo muro que no tienen a su derecha un tile de tipo muro
// Hay que recorrer la habitación por columnas (excepto los de la última columna)
for (int i = 0; i < mapWidth - 1; ++i)
{
if (i % mapWidth != mapWidth - 1)
for (int j = 0; j < mapHeight; ++j)
{
if (getTile(i) == t_wall && getTile(i + 1) != t_wall)
const int pos = (j * mapWidth + i);
if (getTile(pos) == t_wall && getTile(pos + 1) != t_wall)
{
tile.push_back(i);
tile.push_back(pos);
}
}
}
// Recorre el vector de tiles buscando tiles consecutivos para localizar las superficies
// Recorre el vector de tiles buscando tiles consecutivos
// (Los tiles de la misma columna, la diferencia entre ellos es de mapWidth)
// para localizar las superficies
int i = 0;
while (i < tile.size())
{