Resueltos muchos bugs de vector out of range en la busqueda de superficies

This commit is contained in:
2022-10-31 10:07:35 +01:00
parent aa3c7a4b80
commit deb820015f
3 changed files with 188 additions and 86 deletions

View File

@@ -882,33 +882,42 @@ void Room::setBottomSurfaces()
}
// Recorre el vector de tiles buscando tiles consecutivos para localizar las superficies
int i = 0;
int lastOne = 0;
do
if ((int)tile.size() > 0)
{
h_line_t line;
line.x1 = (tile.at(i) % mapWidth) * tileSize;
line.y = ((tile.at(i) / mapWidth) * tileSize) + tileSize - 1;
lastOne = i;
i++;
while (tile.at(i) == tile.at(i - 1) + 1)
int i = 0;
int lastOne = 0;
do
{
h_line_t line;
line.x1 = (tile.at(i) % mapWidth) * tileSize;
line.y = ((tile.at(i) / mapWidth) * tileSize) + tileSize - 1;
lastOne = i;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
line.x2 = ((tile[lastOne] % mapWidth) * tileSize) + tileSize - 1;
bottomSurfaces.push_back(line);
if (tile.at(i) == -1)
{ // Si el siguiente elemento es un separador, hay que saltarlo
i++;
}
} while (i < (int)tile.size() - 1);
if (i < (int)tile.size() - 1)
{
while (tile.at(i) == tile.at(i - 1) + 1)
{
lastOne = i;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
}
line.x2 = ((tile[lastOne] % mapWidth) * tileSize) + tileSize - 1;
bottomSurfaces.push_back(line);
if (i < (int)tile.size() - 1)
{
if (tile.at(i) == -1)
{ // Si el siguiente elemento es un separador, hay que saltarlo
i++;
}
}
} while (i < (int)tile.size() - 1);
}
}
// Calcula las superficies superiores
@@ -933,33 +942,42 @@ void Room::setTopSurfaces()
}
// Recorre el vector de tiles buscando tiles consecutivos para localizar las superficies
int i = 0;
int lastOne = 0;
do
if ((int)tile.size() > 0)
{
h_line_t line;
line.x1 = (tile.at(i) % mapWidth) * tileSize;
line.y = (tile.at(i) / mapWidth) * tileSize;
lastOne = i;
i++;
while (tile.at(i) == tile.at(i - 1) + 1)
int i = 0;
int lastOne = 0;
do
{
h_line_t line;
line.x1 = (tile.at(i) % mapWidth) * tileSize;
line.y = (tile.at(i) / mapWidth) * tileSize;
lastOne = i;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
line.x2 = ((tile[lastOne] % mapWidth) * tileSize) + tileSize - 1;
topSurfaces.push_back(line);
if (tile.at(i) == -1)
{ // Si el siguiente elemento es un separador, hay que saltarlo
i++;
}
} while (i < (int)tile.size() - 1);
if (i < (int)tile.size() - 1)
{
while (tile.at(i) == tile.at(i - 1) + 1)
{
lastOne = i;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
}
line.x2 = ((tile[lastOne] % mapWidth) * tileSize) + tileSize - 1;
topSurfaces.push_back(line);
if (i < (int)tile.size() - 1)
{
if (tile.at(i) == -1)
{ // Si el siguiente elemento es un separador, hay que saltarlo
i++;
}
}
} while (i < (int)tile.size() - 1);
}
}
// Calcula las superficies laterales izquierdas
@@ -984,24 +1002,27 @@ void Room::setLeftSurfaces()
// 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;
do
if ((int)tile.size() > 0)
{
v_line_t line;
line.x = (tile.at(i) % mapWidth) * tileSize;
line.y1 = ((tile.at(i) / mapWidth) * tileSize);
while (tile.at(i) + mapWidth == tile[i + 1])
int i = 0;
do
{
if (i == (int)tile.size() - 1)
v_line_t line;
line.x = (tile.at(i) % mapWidth) * tileSize;
line.y1 = ((tile.at(i) / mapWidth) * tileSize);
while (tile.at(i) + mapWidth == tile[i + 1])
{
break;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
line.y2 = ((tile.at(i) / mapWidth) * tileSize) + tileSize - 1;
leftSurfaces.push_back(line);
i++;
}
line.y2 = ((tile.at(i) / mapWidth) * tileSize) + tileSize - 1;
leftSurfaces.push_back(line);
i++;
} while (i < (int)tile.size() - 1);
} while (i < (int)tile.size() - 1);
}
}
// Calcula las superficies laterales derechas
@@ -1026,24 +1047,27 @@ void Room::setRightSurfaces()
// 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;
do
if ((int)tile.size() > 0)
{
v_line_t line;
line.x = ((tile.at(i) % mapWidth) * tileSize) + tileSize - 1;
line.y1 = ((tile.at(i) / mapWidth) * tileSize);
while (tile.at(i) + mapWidth == tile[i + 1])
int i = 0;
do
{
if (i == (int)tile.size() - 1)
v_line_t line;
line.x = ((tile.at(i) % mapWidth) * tileSize) + tileSize - 1;
line.y1 = ((tile.at(i) / mapWidth) * tileSize);
while (tile.at(i) + mapWidth == tile[i + 1])
{
break;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
line.y2 = ((tile.at(i) / mapWidth) * tileSize) + tileSize - 1;
rightSurfaces.push_back(line);
i++;
}
line.y2 = ((tile.at(i) / mapWidth) * tileSize) + tileSize - 1;
rightSurfaces.push_back(line);
i++;
} while (i < (int)tile.size() - 1);
} while (i < (int)tile.size() - 1);
}
}
// Encuentra todas las rampas que suben hacia la izquierda
@@ -1152,26 +1176,39 @@ void Room::setAutoSurfaces()
// Recorre el vector de tiles buscando tiles consecutivos para localizar las superficies
int i = 0;
int lastOne = 0;
while (i < (int)tile.size())
if ((int)tile.size() > 0)
{
h_line_t line;
line.x1 = (tile.at(i) % mapWidth) * tileSize;
line.y = (tile.at(i) / mapWidth) * tileSize;
lastOne = i;
i++;
while (tile.at(i) == tile.at(i - 1) + 1)
do
{
h_line_t line;
line.x1 = (tile.at(i) % mapWidth) * tileSize;
line.y = (tile.at(i) / mapWidth) * tileSize;
lastOne = i;
i++;
}
line.x2 = ((tile[lastOne] % mapWidth) * tileSize) + tileSize - 1;
autoSurfaces.push_back(line);
if (tile.at(i) == -1)
{ // Si el siguiente elemento es un separador, hay que saltarlo
i++;
}
if (i < (int)tile.size() - 1)
{
while (tile.at(i) == tile.at(i - 1) + 1)
{
lastOne = i;
if (i == (int)tile.size() - 1)
{
break;
}
i++;
}
}
line.x2 = ((tile[lastOne] % mapWidth) * tileSize) + tileSize - 1;
autoSurfaces.push_back(line);
if (i < (int)tile.size() - 1)
{
if (tile.at(i) == -1)
{ // Si el siguiente elemento es un separador, hay que saltarlo
i++;
}
}
} while (i < (int)tile.size() - 1);
}
}