Colisiones básicas completadas

This commit is contained in:
2022-08-17 13:26:22 +02:00
parent a6d6f2854e
commit 9bd1e9b936
11 changed files with 115 additions and 41 deletions

View File

@@ -17,9 +17,14 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map)
sprite = new AnimatedSprite(texture, renderer, asset->get("player.ani"));
sprite->setPosX(16);
sprite->setPosY(0);
x = 16;
y = 40;
vx = 0;
vy = 0;
const SDL_Rect rect = {(int)x, (int)y, 16, 24};
sprite->setPos(rect);
sprite->setCurrentAnimation("stand");
sprite->setFlip(SDL_FLIP_HORIZONTAL);
gravity = 0.5f;
can_jump = true;
@@ -53,8 +58,7 @@ void Player::update()
{
checkInput();
addGravity();
sprite->update();
updateColliders();
move();
}
// Dibuja el objeto
@@ -70,19 +74,19 @@ void Player::checkInput()
// Solo comprueba las entradas de dirección cuando está de pie
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
{
sprite->setVelX(-speed);
vx = -speed;
sprite->setFlip(SDL_FLIP_NONE);
sprite->setCurrentAnimation("walk");
}
else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE))
{
sprite->setVelX(speed);
vx = speed;
sprite->setFlip(SDL_FLIP_HORIZONTAL);
sprite->setCurrentAnimation("walk");
}
else
{
sprite->setVelX(0);
vx = 0;
sprite->setCurrentAnimation("stand");
}
}
@@ -90,13 +94,13 @@ void Player::checkInput()
// Aplica la gravedad
void Player::addGravity()
{
sprite->setVelY(gravity);
vy = gravity;
}
// Actualiza los puntos de colisión
void Player::updateColliders()
{
const SDL_Point p = {(int)sprite->getPosX(), (int)sprite->getPosY()};
const SDL_Point p = {(int)x, (int)y};
collider[0] = p;
collider[1] = {p.x, p.y + 12};
@@ -107,7 +111,7 @@ void Player::updateColliders()
}
// Compruena las colisiones con el mapa
void Player::checkMapCollisions()
bool Player::checkMapCollisions()
{
bool collision = false;
@@ -116,14 +120,29 @@ void Player::checkMapCollisions()
collision |= (map->getTile(c) == wall);
}
if (collision)
{
undoMove();
}
return collision;
}
// Deshace el último movimiento
void Player::undoMove()
// Mueve al jugador en función de la velocidad/desplazamiento
void Player::move()
{
sprite->undoMove();
const float old_x = x;
x += vx;
updateColliders();
if (checkMapCollisions())
{
x = old_x;
}
const float old_y = y;
y += vy;
updateColliders();
if (checkMapCollisions())
{
y = old_y;
}
sprite->setPosX(x);
sprite->setPosY(y);
sprite->update();
}