Files
jaildoctors_dilemma/source/player.cpp

248 lines
5.8 KiB
C++

#include "player.h"
#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)
{
// Obten punteros a objetos
asset = _asset;
renderer = _renderer;
input = _input;
room = _room;
// Crea objetos
texture = new LTexture();
sprite = new AnimatedSprite(texture, renderer);
// Carga la textura
loadTextureFromFile(texture, asset->get(_tileset), renderer);
// Inicializa variables
color = stringToColor("white");
onBorder = false;
border = BORDER_TOP;
status = STATUS_STANDING;
sprite->setPosX(2 * 8);
sprite->setPosX(10 * 8);
sprite->setPosY(12 * 8);
sprite->setPosY(6 * 8);
sprite->setVelX(0);
sprite->setVelY(0);
sprite->setWidth(8);
sprite->setHeight(16);
sprite->setCurrentFrame(0);
sprite->setAnimationCounter(0);
sprite->setAnimationNumFrames(0, 4);
sprite->setAnimationSpeed(0, 5);
sprite->setAnimationLoop(0, true);
sprite->setAnimationFrames(0, 0, 8 * 0, 0, 8, 16);
sprite->setAnimationFrames(0, 1, 8 * 1, 0, 8, 16);
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
Player::~Player()
{
texture->unload();
delete texture;
texture = nullptr;
delete sprite;
sprite = nullptr;
}
// Pinta el enemigo en pantalla
void Player::draw()
{
sprite->getTexture()->setColor(color.r, color.g, color.b);
sprite->render();
sprite->getTexture()->setColor(255, 255, 255);
}
// Actualiza las variables del objeto
void Player::update()
{
setLastPosition();
checkInput();
sprite->update();
checkBorders();
applyGravity();
}
// Comprueba las entradas y modifica variables
void Player::checkInput()
{
// Se mueve en horizontal solo cuando no esté cayendo
if ((input->checkInput(INPUT_LEFT, REPEAT_TRUE)) && (status != STATUS_FALLING))
{
sprite->setVelX(-0.6f);
sprite->animate(0);
sprite->setFlip(SDL_FLIP_HORIZONTAL);
}
else if ((input->checkInput(INPUT_RIGHT, REPEAT_TRUE)) && (status != STATUS_FALLING))
{
sprite->setVelX(0.6f);
sprite->animate(0);
sprite->setFlip(SDL_FLIP_NONE);
}
else
{
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
bool Player::getOnBorder()
{
return onBorder;
}
// Indica en cual de los cuatro bordes se encuentra
int Player::getBorder()
{
return border;
}
// Comprueba si está situado en alguno de los cuatro bordes
void Player::checkBorders()
{
if (sprite->getPosX() < PLAY_AREA_LEFT)
{
border = BORDER_LEFT;
onBorder = true;
}
else if (sprite->getPosX() > PLAY_AREA_RIGHT - sprite->getWidth())
{
border = BORDER_RIGHT;
onBorder = true;
}
else if (sprite->getPosY() < PLAY_AREA_TOP)
{
border = BORDER_TOP;
onBorder = true;
}
else if (sprite->getPosY() > PLAY_AREA_BOTTOM - sprite->getHeight())
{
border = BORDER_BOTTOM;
onBorder = true;
}
else
{
onBorder = false;
}
}
// Cambia al jugador de un borde al opuesto. Util para el cambio de pantalla
void Player::switchBorders()
{
if (border == BORDER_TOP)
{
sprite->setPosY(PLAY_AREA_BOTTOM - sprite->getHeight() - 1);
}
else if (border == BORDER_BOTTOM)
{
sprite->setPosY(PLAY_AREA_TOP + 1);
}
else if (border == BORDER_RIGHT)
{
sprite->setPosX(PLAY_AREA_LEFT + 1);
}
if (border == BORDER_LEFT)
{
sprite->setPosX(PLAY_AREA_RIGHT - sprite->getWidth() - 1);
}
onBorder = false;
}
// Establece el valor de la variable
void Player::setRoom(Room *_room)
{
room = _room;
}
// Obtiene el valor del pixel inferior izquierdo del jugador
SDL_Point Player::getLeftFoot()
{
SDL_Point point = {(int)sprite->getPosX(), (int)sprite->getPosY() + sprite->getHeight()};
return point;
}
// Obtiene el valor del pixel inferior derecho del jugador
SDL_Point Player::getRightFoot()
{
SDL_Point point = {(int)sprite->getPosX() + sprite->getWidth() - 1, (int)sprite->getPosY() + sprite->getHeight()};
return point;
}
// Cambia el estado del jugador
void Player::setStatus(int 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);
}
// 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);
}