Compare commits

..

2 Commits
v0.2 ... v0.3

4 changed files with 152 additions and 37 deletions

View File

@@ -113,9 +113,9 @@ void Game::update()
} }
} }
checkInput();
mRoom->update(); mRoom->update();
mPlayer->update(); mPlayer->update();
checkPlayerAndWalls(); // Debe ir detras del player update, por si se ha metido en algun muro, sacarlo
checkPlayerOnBorder(); checkPlayerOnBorder();
checkPlayerOnFloor(); checkPlayerOnFloor();
} }
@@ -125,9 +125,7 @@ void Game::update()
void Game::draw() void Game::draw()
{ {
// Prepara para dibujar el frame // Prepara para dibujar el frame
const color_t color = {0xAA, 0x55, 0x55};
mScreen->start(); mScreen->start();
mScreen->clean(color);
mScreen->clean(mRoom->getBGColor()); mScreen->clean(mRoom->getBGColor());
mRoom->drawMap(); mRoom->drawMap();
@@ -135,16 +133,26 @@ void Game::draw()
mPlayer->draw(); mPlayer->draw();
// Texto en el centro de la pantalla // 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 // Actualiza la pantalla
mScreen->blit(); mScreen->blit();
} }
// Comprueba la entrada // Comprueba la entrada
/*
void Game::checkInput() void Game::checkInput()
{ {
/*
if (mInput->checkInput(INPUT_UP, REPEAT_FALSE)) if (mInput->checkInput(INPUT_UP, REPEAT_FALSE))
changeRoom(mRoom->getRoomUp()); changeRoom(mRoom->getRoomUp());
@@ -156,8 +164,8 @@ void Game::checkInput()
if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE)) if (mInput->checkInput(INPUT_RIGHT, REPEAT_FALSE))
changeRoom(mRoom->getRoomRight()); changeRoom(mRoom->getRoomRight());
*/
} }
*/
// Cambia de habitación // Cambia de habitación
bool Game::changeRoom(std::string file) bool Game::changeRoom(std::string file)
@@ -201,10 +209,42 @@ void Game::checkPlayerOnFloor()
// Comprueba ambos pies // Comprueba ambos pies
if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot()))) if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot())))
{ {
mPlayer->setFalling(false); mPlayer->setStatus(STATUS_STANDING);
} }
else else
{ {
mPlayer->setFalling(true); 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);
} }
} }

View File

@@ -51,7 +51,7 @@ private:
void draw(); void draw();
// Comprueba la entrada y actua // Comprueba la entrada y actua
void checkInput(); //void checkInput();
// Cambia de habitación // Cambia de habitación
bool changeRoom(std::string file); bool changeRoom(std::string file);
@@ -62,6 +62,9 @@ private:
// Comprueba si el jugador esta sobre el suelo // Comprueba si el jugador esta sobre el suelo
void checkPlayerOnFloor(); void checkPlayerOnFloor();
// Comprueba que el jugador no atraviese ninguna pared
void checkPlayerAndWalls();
public: public:
// Constructor // Constructor
Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input); Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input);

View File

@@ -2,6 +2,8 @@
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
// CAUTION!!!!! si no se gasta al final, quitar la referencia a la habitación
// Constructor // Constructor
Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room) Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room)
{ {
@@ -22,6 +24,7 @@ Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Inp
color = stringToColor("white"); color = stringToColor("white");
onBorder = false; onBorder = false;
border = BORDER_TOP; border = BORDER_TOP;
status = STATUS_STANDING;
sprite->setPosX(2 * 8); sprite->setPosX(2 * 8);
sprite->setPosX(10 * 8); sprite->setPosX(10 * 8);
@@ -41,6 +44,8 @@ Player::Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Inp
sprite->setAnimationFrames(0, 2, 8 * 2, 0, 8, 16); sprite->setAnimationFrames(0, 2, 8 * 2, 0, 8, 16);
sprite->setAnimationFrames(0, 3, 8 * 3, 0, 8, 16); sprite->setAnimationFrames(0, 3, 8 * 3, 0, 8, 16);
sprite->setSpriteClip(sprite->getAnimationClip(0, 0)); sprite->setSpriteClip(sprite->getAnimationClip(0, 0));
lastPosition = getRect();
} }
// Destructor // Destructor
@@ -65,31 +70,26 @@ void Player::draw()
// Actualiza las variables del objeto // Actualiza las variables del objeto
void Player::update() void Player::update()
{ {
setLastPosition();
checkInput(); checkInput();
sprite->update(); sprite->update();
// sprite->animate(0);
checkBorders(); checkBorders();
applyGravity();
} }
// Comprueba las entradas y modifica variables // Comprueba las entradas y modifica variables
void Player::checkInput() void Player::checkInput()
{ {
// if (mInput->checkInput(INPUT_UP, REPEAT_FALSE)) // Se mueve en horizontal solo cuando no esté cayendo
// changeRoom(mRoom->getRoomUp()); if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status != STATUS_FALLING))
//
// if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE))
// changeRoom(mRoom->getRoomDown());
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
{ {
sprite->setVelX(-VX); sprite->setVelX(-0.6f);
sprite->animate(0); sprite->animate(0);
sprite->setFlip(SDL_FLIP_HORIZONTAL); sprite->setFlip(SDL_FLIP_HORIZONTAL);
} }
else if ((input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) && (status != STATUS_FALLING))
else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE))
{ {
sprite->setVelX(VX); sprite->setVelX(0.6f);
sprite->animate(0); sprite->animate(0);
sprite->setFlip(SDL_FLIP_NONE); sprite->setFlip(SDL_FLIP_NONE);
} }
@@ -97,6 +97,11 @@ void Player::checkInput()
{ {
sprite->setVelX(0); sprite->setVelX(0);
} }
if (input->checkInput(INPUT_UP, REPEAT_FALSE))
{
setStatus(STATUS_JUMPING);
}
} }
// Indica si el jugador esta en uno de los cuatro bordes de la pantalla // Indica si el jugador esta en uno de los cuatro bordes de la pantalla
@@ -179,19 +184,65 @@ SDL_Point Player::getLeftFoot()
// Obtiene el valor del pixel inferior derecho del jugador // Obtiene el valor del pixel inferior derecho del jugador
SDL_Point Player::getRightFoot() SDL_Point Player::getRightFoot()
{ {
SDL_Point point = {(int)sprite->getPosX() + sprite->getWidth(), (int)sprite->getPosY() + sprite->getHeight()}; SDL_Point point = {(int)sprite->getPosX() + sprite->getWidth() - 1, (int)sprite->getPosY() + sprite->getHeight()};
return point; return point;
} }
// Establece la velocidad en el eje Y al jugador // Cambia el estado del jugador
void Player::setFalling(bool value) void Player::setStatus(int value)
{ {
if (value) // Si quiere cambiar a saltando, ha de ser desde quieto
if ((value == STATUS_JUMPING) && (status == STATUS_STANDING))
{ {
status = STATUS_JUMPING;
sprite->setVelY(-2.0f);
}
// Si se quiere cambiar a cayendo, ha de ser desde quieto
if ((value == STATUS_FALLING) && (status == STATUS_STANDING))
{
status = STATUS_FALLING;
sprite->setVelY(0.5f); sprite->setVelY(0.5f);
} }
else
// Si se quiere cambiar a quieto, no hay resticciones
if (value == STATUS_STANDING)
{ {
status = STATUS_STANDING;
sprite->setVelY(0.0f); sprite->setVelY(0.0f);
} }
} }
// Aplica gravedad al jugador
void Player::applyGravity()
{
if (status == STATUS_JUMPING)
{
sprite->setVelY(sprite->getVelY() + 0.1f);
if (sprite->getVelY() > 0.5f)
{
sprite->setVelY(0.5f);
// status = STATUS_FALLING;
}
}
}
// Obtiene el rectangulo que delimita al jugador
SDL_Rect Player::getRect()
{
SDL_Rect rect = {(int)sprite->getPosX(), (int)sprite->getPosY(), sprite->getWidth(), sprite->getHeight()};
return rect;
}
// Guarda la posición actual en la variable lastPosition
void Player::setLastPosition()
{
lastPosition = getRect();
}
// Deshace el ultimo movimiento
void Player::undoLastMove()
{
sprite->setPosX(lastPosition.x);
sprite->setPosY(lastPosition.y);
}

View File

@@ -11,7 +11,10 @@
#ifndef PLAYER_H #ifndef PLAYER_H
#define PLAYER_H #define PLAYER_H
#define VX 0.6 //#define VX 0.6
#define STATUS_STANDING 0
#define STATUS_JUMPING 1
#define STATUS_FALLING 2
// Clase Player // Clase Player
class Player class Player
@@ -25,6 +28,7 @@ private:
SDL_Renderer *renderer; // El renderizador de la ventana SDL_Renderer *renderer; // El renderizador de la ventana
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
color_t color; // Color del jugador color_t color; // Color del jugador
SDL_Rect lastPosition; // Contiene la ultima posición del jugador, por si hay que deshacer algun movimiento
bool onBorder; // Indica si el jugador esta en uno de los cuatro bordes de la pantalla bool onBorder; // Indica si el jugador esta en uno de los cuatro bordes de la pantalla
int border; // Indica en cual de los cuatro bordes se encuentra int border; // Indica en cual de los cuatro bordes se encuentra
@@ -35,7 +39,18 @@ private:
// Comprueba si se halla en alguno de los cuatro bordes // Comprueba si se halla en alguno de los cuatro bordes
void checkBorders(); void checkBorders();
// Asigna velocidad negativa en el eje Y al jugador
void jump();
// Aplica gravedad al jugador
void applyGravity();
// Guarda la posición actual en la variable lastPosition
void setLastPosition();
public: public:
int status; // Estado en el que se encuentra el jugador. Util apara saber si está saltando o cayendo
// Constructor // Constructor
Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room); Player(std::string _tileset, SDL_Renderer *_renderer, Asset *_asset, Input *_input, Room *_room);
@@ -66,8 +81,14 @@ public:
// Obtiene el valor del pixel inferior derecho del jugador // Obtiene el valor del pixel inferior derecho del jugador
SDL_Point getRightFoot(); SDL_Point getRightFoot();
// Establece la velocidad en el eje Y al jugador // Cambia el estado del jugador
void setFalling(bool value); void setStatus(int value);
// Obtiene el rectangulo que delimita al jugador
SDL_Rect getRect();
// Deshace el ultimo movimiento
void undoLastMove();
}; };
#endif #endif