#include "player.h" #include #include // 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)); } // 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() { checkInput(); sprite->update(); 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()); // 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(), (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 = {sprite->getPosX(), sprite->getPosY(), sprite->getWidth(), sprite->getHeight()}; return rect; }