Primera implementacion de tiles atravesables. No funcionará si estan apilados

This commit is contained in:
2022-08-19 12:33:42 +02:00
parent 76696f9eb7
commit 0624cff845
6 changed files with 71 additions and 52 deletions

View File

@@ -17,6 +17,8 @@ Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map)
sprite = new AnimatedSprite(texture, renderer, asset->get("player.ani"));
w = 16;
h = 24;
x = 3 * 16;
y = 168;
vx = 0;
@@ -164,9 +166,9 @@ void Player::updateFeet()
{
const SDL_Point p = {(int)x, (int)y};
underFeet[0] = {p.x, p.y + 24};
underFeet[1] = {p.x + 7, p.y + 24};
underFeet[2] = {p.x + 15, p.y + 24};
underFeet[0] = {p.x, p.y + h};
underFeet[1] = {p.x + 7, p.y + h};
underFeet[2] = {p.x + 15, p.y + h};
}
// Compruena las colisiones con el mapa
@@ -187,9 +189,12 @@ bool Player::checkMapCollisions()
// Mueve al jugador en función de la velocidad/desplazamiento
void Player::move()
{
const int tile = map->getTileWidth();
x += vx;
if (checkMapCollisions())
{
// Recoloca
if (vx > 0)
{
do
@@ -208,27 +213,28 @@ void Player::move()
vx = 0.0f;
}
const bool wasOnFloor = isOnFloor();
y += vy;
if (checkMapCollisions())
{
if (vy > 0)
// Recoloca
if (vy > 0.0f)
{
do
{
y--;
} while (checkMapCollisions());
jumping = false;
vy = 0.0f;
y -= ((int)y + h) % tile;
}
else
{
do
{
y++;
} while (checkMapCollisions());
jumping = false;
vy = 0.0f;
y += tile - ((int)y % tile);
}
jumping = false;
vy = 0.0f;
}
else if ((!wasOnFloor) && (isOnFloor()) && (vy > 0.0f))
{
jumping = false;
vy = 0.0f;
y -= ((int)y + h) % tile;
}
sprite->setPosX(x);
@@ -266,7 +272,7 @@ bool Player::isOnFloor()
for (auto f : underFeet)
{
onFloor |= (map->getTile(f) == wall);
onFloor |= ((map->getTile(f) == wall) || (map->getTile(f) == passable));
}
return onFloor;
}