Colisiones básicas completadas
This commit is contained in:
@@ -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();
|
||||
}
|
||||
Reference in New Issue
Block a user