|
|
|
|
@@ -128,17 +128,7 @@ void Game::update()
|
|
|
|
|
checkPlayerOnBorder();
|
|
|
|
|
checkPlayerOnFloor();
|
|
|
|
|
checkPlayerAndItems();
|
|
|
|
|
if (checkPlayerAndEnemies())
|
|
|
|
|
{
|
|
|
|
|
// Destruye la habitacion y el jugador
|
|
|
|
|
delete mRoom;
|
|
|
|
|
delete mPlayer;
|
|
|
|
|
|
|
|
|
|
// Crea la nueva habitación y el nuevo jugador
|
|
|
|
|
mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset, mItemTracker);
|
|
|
|
|
mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
checkPlayerAndEnemies();
|
|
|
|
|
checkInput();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -300,7 +290,7 @@ void Game::checkPlayerOnFloor()
|
|
|
|
|
// Comprueba que el jugador no atraviese ninguna pared
|
|
|
|
|
void Game::checkPlayerAndWalls()
|
|
|
|
|
{
|
|
|
|
|
// Comprueba las cuatro esquinas de los dos tiles del jugador
|
|
|
|
|
// Obtiene los ocho puntos de colisión del jugador
|
|
|
|
|
const SDL_Rect rect = mPlayer->getRect();
|
|
|
|
|
const SDL_Point p1 = {rect.x, rect.y};
|
|
|
|
|
const SDL_Point p2 = {rect.x + 7, rect.y};
|
|
|
|
|
@@ -311,32 +301,66 @@ void Game::checkPlayerAndWalls()
|
|
|
|
|
const SDL_Point p7 = {rect.x + 7, rect.y + 15};
|
|
|
|
|
const SDL_Point p8 = {rect.x, rect.y + 15};
|
|
|
|
|
|
|
|
|
|
bool test = false;
|
|
|
|
|
test |= (mRoom->getTile(p1) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p2) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p3) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p4) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p5) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p6) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p7) == TILE_SOLID);
|
|
|
|
|
test |= (mRoom->getTile(p8) == TILE_SOLID);
|
|
|
|
|
// Comprueba si ha colisionado con un muro
|
|
|
|
|
bool wall = false;
|
|
|
|
|
wall |= (mRoom->getTile(p1) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p2) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p3) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p4) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p5) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p6) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p7) == TILE_SOLID);
|
|
|
|
|
wall |= (mRoom->getTile(p8) == TILE_SOLID);
|
|
|
|
|
|
|
|
|
|
if (test)
|
|
|
|
|
if (wall)
|
|
|
|
|
{
|
|
|
|
|
// Si hay colisión, deshace el movimiento y lo pone en modo caída
|
|
|
|
|
mPlayer->undoLastMove();
|
|
|
|
|
mPlayer->setStatus(STATUS_FALLING);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba si ha colisionado con un tile de los que matan al jugador
|
|
|
|
|
bool death = false;
|
|
|
|
|
death |= (mRoom->getTile(p1) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p2) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p3) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p4) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p5) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p6) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p7) == TILE_KILL);
|
|
|
|
|
death |= (mRoom->getTile(p8) == TILE_KILL);
|
|
|
|
|
|
|
|
|
|
if (death)
|
|
|
|
|
{
|
|
|
|
|
killPlayer();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba las colisiones del jugador con los enemigos
|
|
|
|
|
bool Game::checkPlayerAndEnemies()
|
|
|
|
|
{
|
|
|
|
|
return mRoom->enemyCollision(mPlayer->getCollider());
|
|
|
|
|
const bool death = mRoom->enemyCollision(mPlayer->getCollider());
|
|
|
|
|
if (death)
|
|
|
|
|
{
|
|
|
|
|
killPlayer();
|
|
|
|
|
}
|
|
|
|
|
return death;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comprueba las colisiones del jugador con los objetos
|
|
|
|
|
void Game::checkPlayerAndItems()
|
|
|
|
|
{
|
|
|
|
|
mRoom->itemCollision(mPlayer->getCollider());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Mata al jugador
|
|
|
|
|
void Game::killPlayer()
|
|
|
|
|
{
|
|
|
|
|
// Destruye la habitacion y el jugador
|
|
|
|
|
delete mRoom;
|
|
|
|
|
delete mPlayer;
|
|
|
|
|
|
|
|
|
|
// Crea la nueva habitación y el nuevo jugador
|
|
|
|
|
mRoom = new Room(mAsset->get(mCurrentRoom), mRenderer, mAsset, mItemTracker);
|
|
|
|
|
mPlayer = new Player(mSpawnPoint, mAsset->get("player01.png"), mRenderer, mAsset, mInput, mRoom);
|
|
|
|
|
}
|