forked from jaildesigner-jailgames/jaildoctors_dilemma
Trabajando en las colisiones y estados
This commit is contained in:
@@ -15,8 +15,8 @@
|
|||||||
26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,0,212,212,181,0,0,0,0,0,0,0,0,0,0,26,
|
26,0,0,0,0,0,0,0,0,161,212,212,212,212,212,212,212,0,212,212,181,0,0,0,0,0,0,0,0,0,0,26,
|
||||||
26,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,0,0,
|
26,0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,0,181,0,0,0,0,0,0,0,0,0,0,
|
||||||
0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,269,0,0,0,0,181,0,0,0,0,0,0,0,0,26,
|
0,0,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,269,0,0,0,0,181,0,0,0,0,0,0,0,0,26,
|
||||||
26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,181,0,0,0,0,0,0,0,0,
|
26,0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,269,0,0,0,0,0,181,0,61,0,0,0,0,0,1,
|
||||||
0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,0,0,0,181,0,0,0,0,0,0,0,
|
0,0,0,0,0,161,0,0,0,0,0,0,0,0,0,0,0,289,0,0,0,0,0,0,181,0,0,0,0,0,0,1,
|
||||||
26,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,
|
26,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,
|
||||||
26,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26
|
26,0,26,0,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26
|
||||||
</data>
|
</data>
|
||||||
|
|||||||
@@ -77,7 +77,12 @@ void Player::update()
|
|||||||
// Comprueba las entradas y modifica variables
|
// Comprueba las entradas y modifica variables
|
||||||
void Player::checkInput()
|
void Player::checkInput()
|
||||||
{
|
{
|
||||||
// Solo comprueba las entradas de dirección cuando está de pie
|
// Solo comprueba las entradas de dirección cuando está dsobre una superficie
|
||||||
|
if (!isOnFloor())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (state == s_standing))
|
if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (state == s_standing))
|
||||||
{
|
{
|
||||||
vx = -0.6f;
|
vx = -0.6f;
|
||||||
@@ -189,8 +194,8 @@ void Player::applyGravity()
|
|||||||
{
|
{
|
||||||
const float gf = 0.035f;
|
const float gf = 0.035f;
|
||||||
|
|
||||||
// La gravedad solo se aplica cuando está saltando
|
// La gravedad solo se aplica cuando no está sobre una superficie
|
||||||
if (state == s_jumping)
|
if (!isOnFloor())
|
||||||
{
|
{
|
||||||
vy += gf;
|
vy += gf;
|
||||||
if (vy > maxVY)
|
if (vy > maxVY)
|
||||||
@@ -221,8 +226,112 @@ void Player::move()
|
|||||||
applyGravity(); // Aplica gravedad al jugador
|
applyGravity(); // Aplica gravedad al jugador
|
||||||
checkState(); // Comprueba el estado del jugador
|
checkState(); // Comprueba el estado del jugador
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
//--- NUEVA DETECCION DE COLISIONES ---
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
|
||||||
|
// Se mueve hacia la izquierda
|
||||||
|
if (vx < 0.0f)
|
||||||
|
{
|
||||||
|
// Crea el rectangulo de proyección en el eje X para ver si colisiona
|
||||||
|
SDL_Rect proj;
|
||||||
|
proj.x = lastPosition.x;
|
||||||
|
proj.y = lastPosition.y;
|
||||||
|
proj.h = h;
|
||||||
|
proj.w = (int)vx;
|
||||||
|
|
||||||
|
// Comprueba la colisión
|
||||||
|
const int pos = room->checkRightSurfaces(&proj);
|
||||||
|
|
||||||
|
// Calcula la nueva posición
|
||||||
|
if (pos == -1)
|
||||||
|
{ // Si no hay colisión
|
||||||
|
x += vx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Si hay colisión lo coloca donde colisiona
|
||||||
|
x = pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se mueve hacia la derecha
|
||||||
|
if (vx > 0.0f)
|
||||||
|
{
|
||||||
|
// Crea el rectangulo de proyección en el eje X para ver si colisiona
|
||||||
|
SDL_Rect proj;
|
||||||
|
proj.x = lastPosition.x + w;
|
||||||
|
proj.y = lastPosition.y;
|
||||||
|
proj.h = h;
|
||||||
|
proj.w = (int)(vx);
|
||||||
|
|
||||||
|
// Comprueba la colisión
|
||||||
|
const int pos = room->checkLeftSurfaces(&proj);
|
||||||
|
|
||||||
|
// Calcula la nueva posición
|
||||||
|
if (pos == -1)
|
||||||
|
{ // Si no hay colisión
|
||||||
|
x += vx;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Si hay colisión lo coloca donde colisiona
|
||||||
|
x = pos - w;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se mueve hacia arriba
|
||||||
|
if (vy < 0.0f)
|
||||||
|
{
|
||||||
|
// Crea el rectangulo de proyección en el eje X para ver si colisiona
|
||||||
|
SDL_Rect proj;
|
||||||
|
proj.x = lastPosition.x;
|
||||||
|
proj.y = lastPosition.y;
|
||||||
|
proj.h = (int)vy;
|
||||||
|
proj.w = w;
|
||||||
|
|
||||||
|
// Comprueba la colisión
|
||||||
|
const int pos = room->checkBottomSurfaces(&proj);
|
||||||
|
|
||||||
|
// Calcula la nueva posición
|
||||||
|
if (pos == -1)
|
||||||
|
{ // Si no hay colisión
|
||||||
|
y += vy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Si hay colisión lo coloca donde colisiona
|
||||||
|
y = pos;
|
||||||
|
state = s_falling;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se mueve hacia abajo
|
||||||
|
if (vy > 0.0f)
|
||||||
|
{
|
||||||
|
// Crea el rectangulo de proyección en el eje X para ver si colisiona
|
||||||
|
SDL_Rect proj;
|
||||||
|
proj.x = lastPosition.x;
|
||||||
|
proj.y = lastPosition.y + h;
|
||||||
|
proj.h = (int)vy;
|
||||||
|
proj.w = w;
|
||||||
|
|
||||||
|
// Comprueba la colisión
|
||||||
|
const int pos = room->checkTopSurfaces(&proj);
|
||||||
|
|
||||||
|
// Calcula la nueva posición
|
||||||
|
if (pos == -1)
|
||||||
|
{ // Si no hay colisión
|
||||||
|
y += vy;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ // Si hay colisión lo coloca donde colisiona
|
||||||
|
y = pos - h;
|
||||||
|
state = s_standing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------
|
||||||
|
|
||||||
// Calcula la nueva posición del jugador y compensa en caso de colisión
|
// Calcula la nueva posición del jugador y compensa en caso de colisión
|
||||||
x += vx;
|
/*x += vx;
|
||||||
|
|
||||||
// Comprueba colisiones con muros
|
// Comprueba colisiones con muros
|
||||||
if (checkWalls())
|
if (checkWalls())
|
||||||
@@ -358,7 +467,7 @@ void Player::move()
|
|||||||
vy = 0.0f;
|
vy = 0.0f;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}*/
|
||||||
|
|
||||||
// Actualiza la posición del sprite
|
// Actualiza la posición del sprite
|
||||||
sprite->setPosX(x);
|
sprite->setPosX(x);
|
||||||
@@ -396,9 +505,11 @@ bool Player::isOnFloor()
|
|||||||
for (auto f : underFeet)
|
for (auto f : underFeet)
|
||||||
{
|
{
|
||||||
const tile_e tile = (room->getTile(f));
|
const tile_e tile = (room->getTile(f));
|
||||||
onFloor |= (tile == t_wall || tile == t_passable || tile == t_slope_l || tile == t_slope_r);
|
onFloor |= (tile == t_wall || tile == t_passable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
debug->add("ONFLOOR = " + std::to_string(onFloor));
|
||||||
|
|
||||||
return onFloor;
|
return onFloor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -476,7 +476,7 @@ void Room::fillMapTexture()
|
|||||||
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
|
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
|
||||||
for (auto l : rightSurfaces)
|
for (auto l : rightSurfaces)
|
||||||
{
|
{
|
||||||
SDL_SetRenderDrawColor(renderer, (rand() % 128)+80, (rand() % 128)+80, (rand() % 128)+80, 0xFF);
|
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_RenderDrawLine(renderer, l.x, l.y1, l.x, l.y2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -862,4 +862,80 @@ void Room::setRightSurfaces()
|
|||||||
rightSurfaces.push_back(line);
|
rightSurfaces.push_back(line);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int Room::checkRightSurfaces(SDL_Rect *rect)
|
||||||
|
{
|
||||||
|
bool collision = false;
|
||||||
|
int pos = -1;
|
||||||
|
|
||||||
|
for (auto s : rightSurfaces)
|
||||||
|
{
|
||||||
|
collision = checkCollision(s, *rect);
|
||||||
|
if (collision)
|
||||||
|
{
|
||||||
|
pos = s.x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int Room::checkLeftSurfaces(SDL_Rect *rect)
|
||||||
|
{
|
||||||
|
bool collision = false;
|
||||||
|
int pos = -1;
|
||||||
|
|
||||||
|
for (auto s : leftSurfaces)
|
||||||
|
{
|
||||||
|
collision = checkCollision(s, *rect);
|
||||||
|
if (collision)
|
||||||
|
{
|
||||||
|
pos = s.x;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int Room::checkTopSurfaces(SDL_Rect *rect)
|
||||||
|
{
|
||||||
|
bool collision = false;
|
||||||
|
int pos = -1;
|
||||||
|
|
||||||
|
for (auto s : topSurfaces)
|
||||||
|
{
|
||||||
|
collision = checkCollision(s, *rect);
|
||||||
|
if (collision)
|
||||||
|
{
|
||||||
|
pos = s.y;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int Room::checkBottomSurfaces(SDL_Rect *rect)
|
||||||
|
{
|
||||||
|
bool collision = false;
|
||||||
|
int pos = -1;
|
||||||
|
|
||||||
|
for (auto s : bottomSurfaces)
|
||||||
|
{
|
||||||
|
collision = checkCollision(s, *rect);
|
||||||
|
if (collision)
|
||||||
|
{
|
||||||
|
pos = s.y;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
}
|
}
|
||||||
@@ -149,6 +149,18 @@ public:
|
|||||||
|
|
||||||
// Obten la coordenada de la cuesta a partir de un punto perteneciente a ese tile
|
// Obten la coordenada de la cuesta a partir de un punto perteneciente a ese tile
|
||||||
int getSlopeHeight(SDL_Point p, tile_e slope);
|
int getSlopeHeight(SDL_Point p, tile_e slope);
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int checkRightSurfaces(SDL_Rect *rect);
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int checkLeftSurfaces(SDL_Rect *rect);
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int checkTopSurfaces(SDL_Rect *rect);
|
||||||
|
|
||||||
|
// Comprueba las colisiones
|
||||||
|
int checkBottomSurfaces(SDL_Rect *rect);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user