forked from jaildesigner-jailgames/jaildoctors_dilemma
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 216fc1e19c | |||
| 9ecab3ea59 |
@@ -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)
|
||||
@@ -201,10 +209,42 @@ void Game::checkPlayerOnFloor()
|
||||
// Comprueba ambos pies
|
||||
if ((mRoom->isFloor(mPlayer->getLeftFoot())) || (mRoom->isFloor(mPlayer->getRightFoot())))
|
||||
{
|
||||
mPlayer->setFalling(false);
|
||||
mPlayer->setStatus(STATUS_STANDING);
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -51,7 +51,7 @@ private:
|
||||
void draw();
|
||||
|
||||
// Comprueba la entrada y actua
|
||||
void checkInput();
|
||||
//void checkInput();
|
||||
|
||||
// Cambia de habitación
|
||||
bool changeRoom(std::string file);
|
||||
@@ -62,6 +62,9 @@ private:
|
||||
// Comprueba si el jugador esta sobre el suelo
|
||||
void checkPlayerOnFloor();
|
||||
|
||||
// Comprueba que el jugador no atraviese ninguna pared
|
||||
void checkPlayerAndWalls();
|
||||
|
||||
public:
|
||||
// Constructor
|
||||
Game(SDL_Window *window, SDL_Renderer *renderer, Asset *asset, Lang *lang, Input *input);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
// CAUTION!!!!! si no se gasta al final, quitar la referencia a la habitación
|
||||
|
||||
// Constructor
|
||||
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");
|
||||
onBorder = false;
|
||||
border = BORDER_TOP;
|
||||
status = STATUS_STANDING;
|
||||
|
||||
sprite->setPosX(2 * 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, 3, 8 * 3, 0, 8, 16);
|
||||
sprite->setSpriteClip(sprite->getAnimationClip(0, 0));
|
||||
|
||||
lastPosition = getRect();
|
||||
}
|
||||
|
||||
// Destructor
|
||||
@@ -65,31 +70,26 @@ void Player::draw()
|
||||
// Actualiza las variables del objeto
|
||||
void Player::update()
|
||||
{
|
||||
setLastPosition();
|
||||
checkInput();
|
||||
sprite->update();
|
||||
// sprite->animate(0);
|
||||
checkBorders();
|
||||
applyGravity();
|
||||
}
|
||||
|
||||
// Comprueba las entradas y modifica variables
|
||||
void Player::checkInput()
|
||||
{
|
||||
// if (mInput->checkInput(INPUT_UP, REPEAT_FALSE))
|
||||
// changeRoom(mRoom->getRoomUp());
|
||||
//
|
||||
// if (mInput->checkInput(INPUT_DOWN, REPEAT_FALSE))
|
||||
// changeRoom(mRoom->getRoomDown());
|
||||
|
||||
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
|
||||
// Se mueve en horizontal solo cuando no esté cayendo
|
||||
if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status != STATUS_FALLING))
|
||||
{
|
||||
sprite->setVelX(-VX);
|
||||
sprite->setVelX(-0.6f);
|
||||
sprite->animate(0);
|
||||
sprite->setFlip(SDL_FLIP_HORIZONTAL);
|
||||
}
|
||||
|
||||
else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE))
|
||||
else if ((input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) && (status != STATUS_FALLING))
|
||||
{
|
||||
sprite->setVelX(VX);
|
||||
sprite->setVelX(0.6f);
|
||||
sprite->animate(0);
|
||||
sprite->setFlip(SDL_FLIP_NONE);
|
||||
}
|
||||
@@ -97,6 +97,11 @@ void Player::checkInput()
|
||||
{
|
||||
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
|
||||
@@ -179,19 +184,65 @@ SDL_Point Player::getLeftFoot()
|
||||
// Obtiene el valor del pixel inferior derecho del jugador
|
||||
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;
|
||||
}
|
||||
|
||||
// Establece la velocidad en el eje Y al jugador
|
||||
void Player::setFalling(bool value)
|
||||
// Cambia el estado del jugador
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
||||
// Si se quiere cambiar a quieto, no hay resticciones
|
||||
if (value == STATUS_STANDING)
|
||||
{
|
||||
status = STATUS_STANDING;
|
||||
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);
|
||||
}
|
||||
@@ -11,7 +11,10 @@
|
||||
#ifndef 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
|
||||
class Player
|
||||
@@ -25,6 +28,7 @@ private:
|
||||
SDL_Renderer *renderer; // El renderizador de la ventana
|
||||
Asset *asset; // Objeto con la ruta a todos los ficheros de recursos
|
||||
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
|
||||
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
|
||||
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:
|
||||
int status; // Estado en el que se encuentra el jugador. Util apara saber si está saltando o cayendo
|
||||
|
||||
// Constructor
|
||||
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
|
||||
SDL_Point getRightFoot();
|
||||
|
||||
// Establece la velocidad en el eje Y al jugador
|
||||
void setFalling(bool value);
|
||||
// Cambia el estado del jugador
|
||||
void setStatus(int value);
|
||||
|
||||
// Obtiene el rectangulo que delimita al jugador
|
||||
SDL_Rect getRect();
|
||||
|
||||
// Deshace el ultimo movimiento
|
||||
void undoLastMove();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user