Ya funcionan los tiles atravesables

This commit is contained in:
2022-07-10 21:10:45 +02:00
parent bade27edc4
commit 8d49c78519
5 changed files with 58 additions and 26 deletions

View File

@@ -145,6 +145,9 @@ void Game::draw()
text = "status: " + std::to_string(mPlayer->status); text = "status: " + std::to_string(mPlayer->status);
mText->write(0, 17 * 8, text); mText->write(0, 17 * 8, text);
text = "foot: " + std::to_string((int)mPlayer->getLeftFoot().y);
mText->write(0, 18 * 8, text);
// Actualiza la pantalla // Actualiza la pantalla
mScreen->blit(); mScreen->blit();
} }
@@ -208,8 +211,17 @@ void Game::checkPlayerOnBorder()
// Comprueba si el jugador esta sobre el suelo // Comprueba si el jugador esta sobre el suelo
void Game::checkPlayerOnFloor() void Game::checkPlayerOnFloor()
{ {
// Comprueba ambos pies // Comprueba si tiene suelo bajo los pies solo cuando no hay velocidad de subida
if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot()))) // y solo cuando el pie este encima de un bloque, es decir, en multiplos de 8
if ((mPlayer->getVelY() >= 0) && ((int)mPlayer->getLeftFoot().y % 8 == 0))
{ // Comprueba ambos pies
bool test = false;
test |= (mRoom->getTile(mPlayer->getLeftFoot()) == TILE_SOLID);
test |= (mRoom->getTile(mPlayer->getRightFoot()) == TILE_SOLID);
test |= (mRoom->getTile(mPlayer->getLeftFoot()) == TILE_TRAVESSABLE);
test |= (mRoom->getTile(mPlayer->getRightFoot()) == TILE_TRAVESSABLE);
if (test)
{ {
mPlayer->setStatus(STATUS_STANDING); mPlayer->setStatus(STATUS_STANDING);
} }
@@ -217,6 +229,7 @@ void Game::checkPlayerOnFloor()
{ {
mPlayer->setStatus(STATUS_FALLING); mPlayer->setStatus(STATUS_FALLING);
} }
}
} }
// Comprueba que el jugador no atraviese ninguna pared // Comprueba que el jugador no atraviese ninguna pared
@@ -234,14 +247,14 @@ void Game::checkPlayerAndWalls()
SDL_Point p7 = {rect.x + 7, rect.y + 15}; SDL_Point p7 = {rect.x + 7, rect.y + 15};
SDL_Point p8 = {rect.x, rect.y + 15}; SDL_Point p8 = {rect.x, rect.y + 15};
bool test = mRoom->isFloor(p1); bool test = (mRoom->getTile(p1) == TILE_SOLID);
test |= mRoom->isFloor(p2); test |= (mRoom->getTile(p2) == TILE_SOLID);
test |= mRoom->isFloor(p3); test |= (mRoom->getTile(p3) == TILE_SOLID);
test |= mRoom->isFloor(p4); test |= (mRoom->getTile(p4) == TILE_SOLID);
test |= mRoom->isFloor(p5); test |= (mRoom->getTile(p5) == TILE_SOLID);
test |= mRoom->isFloor(p6); test |= (mRoom->getTile(p6) == TILE_SOLID);
test |= mRoom->isFloor(p7); test |= (mRoom->getTile(p7) == TILE_SOLID);
test |= mRoom->isFloor(p8); test |= (mRoom->getTile(p8) == TILE_SOLID);
if (test) if (test)
{ {

View File

@@ -219,6 +219,12 @@ int Player::getStatus()
return status; return status;
} }
// Obtiene la velocidad en el eje Y del jugador
float Player::getVelY()
{
return sprite->getVelY();
}
// Aplica gravedad al jugador // Aplica gravedad al jugador
void Player::applyGravity() void Player::applyGravity()
{ {

View File

@@ -93,6 +93,9 @@ public:
// Obtiene el estado del jugador // Obtiene el estado del jugador
int getStatus(); int getStatus();
// Obtiene la velocidad en el eje Y del jugador
float getVelY();
// Obtiene el rectangulo que delimita al jugador // Obtiene el rectangulo que delimita al jugador
SDL_Rect getRect(); SDL_Rect getRect();

View File

@@ -308,18 +308,24 @@ std::string Room::getRoom(int border)
return ""; return "";
} }
// Indica si el tile al que pertenece el pixel es sólido o no // Devuelve el tipo de tile que hay en ese pixel
bool Room::isFloor(SDL_Point point) int Room::getTile(SDL_Point point)
{ {
int tile = ((point.y / 8) * 32) + (point.x / 8); int pos = ((point.y / 8) * 32) + (point.x / 8);
int tile = TILE_EMPTY;
if (tile < 512) if (pos < 512)
{ {
if (tilemap[tile] != 0) if (tilemap[pos] == 41)
{ {
return true; return TILE_SOLID;
}
if (tilemap[pos] == 81)
{
return TILE_TRAVESSABLE;
} }
} }
return false; return tile;
} }

View File

@@ -10,6 +10,10 @@
#ifndef ROOM_H #ifndef ROOM_H
#define ROOM_H #define ROOM_H
#define TILE_EMPTY 0
#define TILE_SOLID 1
#define TILE_TRAVESSABLE 2
/* /*
Cada habitación se crea y destruye cada vez que se entra o sale de la misma Cada habitación se crea y destruye cada vez que se entra o sale de la misma
Cada habitacion si que tendra lo siguiente: Cada habitacion si que tendra lo siguiente:
@@ -81,8 +85,8 @@ public:
// Devuelve la cadena del fichero de la habitación contigua segun el borde // Devuelve la cadena del fichero de la habitación contigua segun el borde
std::string getRoom(int border); std::string getRoom(int border);
// Indica si el tile al que pertenece el pixel es sólido o no // Devuelve el tipo de tile que hay en ese pixel
bool isFloor(SDL_Point point); int getTile(SDL_Point point);
}; };
#endif #endif