Depurando los saltos con colisiones

This commit is contained in:
2022-07-07 20:07:29 +02:00
parent 9ecab3ea59
commit 216fc1e19c
4 changed files with 84 additions and 24 deletions

View File

@@ -113,9 +113,9 @@ void Game::update()
}
}
checkInput();
mRoom->update();
mPlayer->update();
checkPlayerAndWalls(); // Debe ir detras del player update, por si se ha metido en algun muro, sacarlo
checkPlayerOnBorder();
checkPlayerOnFloor();
}
@@ -125,9 +125,7 @@ void Game::update()
void Game::draw()
{
// Prepara para dibujar el frame
const color_t color = {0xAA, 0x55, 0x55};
mScreen->start();
mScreen->clean(color);
mScreen->clean(mRoom->getBGColor());
mRoom->drawMap();
@@ -135,29 +133,39 @@ void Game::draw()
mPlayer->draw();
// Texto en el centro de la pantalla
mText->writeCentered(GAMECANVAS_CENTER_X, 18 * 8, mRoom->getName());
SDL_Rect rect = {0, 16 * 8, PLAY_AREA_RIGHT, 8};
color_t color = stringToColor("light_black");
SDL_SetRenderDrawColor(mRenderer, color.r, color.g, color.b, 0xFF);
SDL_RenderFillRect(mRenderer, &rect);
mText->writeCentered(GAMECANVAS_CENTER_X, 16 * 8, mRoom->getName());
// Debug info
std::string text;
text = "status: " + std::to_string(mPlayer->status);
mText->write(0, 17 * 8, text);
// Actualiza la pantalla
mScreen->blit();
}
// Comprueba la entrada
/*
void Game::checkInput()
{
/*
if (mInput->checkInput(INPUT_UP, REPEAT_FALSE))
changeRoom(mRoom->getRoomUp());
if (mInput->checkInput(INPUT_UP, REPEAT_FALSE))
changeRoom(mRoom->getRoomUp());
if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE))
changeRoom(mRoom->getRoomDown());
if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE))
changeRoom(mRoom->getRoomDown());
if (mInput->checkInput(INPUT_LEFT, REPEAT_FALSE))
changeRoom(mRoom->getRoomLeft());
if (mInput->checkInput(INPUT_LEFT, REPEAT_FALSE))
changeRoom(mRoom->getRoomLeft());
if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE))
changeRoom(mRoom->getRoomRight());
*/
if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE))
changeRoom(mRoom->getRoomRight());
}
*/
// Cambia de habitación
bool Game::changeRoom(std::string file)
@@ -207,4 +215,36 @@ void Game::checkPlayerOnFloor()
{
mPlayer->setStatus(STATUS_FALLING);
}
}
// Comprueba que el jugador no atraviese ninguna pared
void Game::checkPlayerAndWalls()
{
// Hayque comprobar las cuatro esquinas del tile superior
// y las cuatro del tile inferior
SDL_Rect rect = mPlayer->getRect();
SDL_Point p1 = {rect.x, rect.y};
SDL_Point p2 = {rect.x + 7, rect.y};
SDL_Point p3 = {rect.x + 7, rect.y + 7};
SDL_Point p4 = {rect.x, rect.y + 7};
SDL_Point p5 = {rect.x, rect.y + 8};
SDL_Point p6 = {rect.x + 7, rect.y + 8};
SDL_Point p7 = {rect.x + 7, rect.y + 15};
SDL_Point p8 = {rect.x, rect.y + 15};
bool test = mRoom->isFloor(p1);
test |= mRoom->isFloor(p2);
test |= mRoom->isFloor(p3);
test |= mRoom->isFloor(p4);
test |= mRoom->isFloor(p5);
test |= mRoom->isFloor(p6);
test |= mRoom->isFloor(p7);
test |= mRoom->isFloor(p8);
if (test)
{
mPlayer->undoLastMove();
// mPlayer->setStatus(STATUS_STANDING);
}
}