Files
volcano_2022/source/player.cpp

148 lines
3.1 KiB
C++

#include "player.h"
// Constructor
Player::Player(SDL_Renderer *renderer, Asset *asset, Input *input, Map *map)
{
this->asset = asset;
this->renderer = renderer;
this->input = input;
this->map = map;
sound_jump = JA_LoadSound(asset->get("sound_player_jump.wav").c_str());
sound_death = JA_LoadSound(asset->get("sound_player_death.wav").c_str());
sound_coin = JA_LoadSound(asset->get("sound_player_coin.wav").c_str());
texture = new LTexture();
loadTextureFromFile(texture, asset->get("player.png"), renderer);
sprite = new AnimatedSprite(texture, renderer, asset->get("player.ani"));
x = 16;
y = 40;
vx = 0;
vy = 0;
const SDL_Rect rect = {(int)x, (int)y, 16, 24};
sprite->setPos(rect);
sprite->setCurrentAnimation("stand");
sprite->setFlip(SDL_FLIP_HORIZONTAL);
gravity = 0.5f;
can_jump = true;
standing = true;
invulnerable = true;
jumpforce = 10;
enabled = true;
cooldown = 0;
lifes = 10;
coins = 0;
key.insert(key.end(), {0, 0, 0, 0, 0, 0});
const SDL_Point p = {0, 0};
collider.insert(collider.end(), {p, p, p, p, p, p});
}
// Destructor
Player::~Player()
{
JA_DeleteSound(sound_jump);
JA_DeleteSound(sound_death);
JA_DeleteSound(sound_coin);
texture->unload();
delete texture;
delete sprite;
}
// Actualiza todas las variables
void Player::update()
{
checkInput();
addGravity();
move();
}
// Dibuja el objeto
void Player::render()
{
sprite->render();
}
// Comprueba las entradas y modifica variables
void Player::checkInput()
{
const float speed = 1.0f;
// Solo comprueba las entradas de dirección cuando está de pie
if (input->checkInput(INPUT_LEFT, REPEAT_TRUE))
{
vx = -speed;
sprite->setFlip(SDL_FLIP_NONE);
sprite->setCurrentAnimation("walk");
}
else if (input->checkInput(INPUT_RIGHT, REPEAT_TRUE))
{
vx = speed;
sprite->setFlip(SDL_FLIP_HORIZONTAL);
sprite->setCurrentAnimation("walk");
}
else
{
vx = 0;
sprite->setCurrentAnimation("stand");
}
}
// Aplica la gravedad
void Player::addGravity()
{
vy = gravity;
}
// Actualiza los puntos de colisión
void Player::updateColliders()
{
const SDL_Point p = {(int)x, (int)y};
collider[0] = p;
collider[1] = {p.x, p.y + 12};
collider[2] = {p.x, p.y + 23};
collider[3] = {p.x + 15, p.y};
collider[4] = {p.x + 15, p.y + 12};
collider[5] = {p.x + 15, p.y + 23};
}
// Compruena las colisiones con el mapa
bool Player::checkMapCollisions()
{
bool collision = false;
for (auto c : collider)
{
collision |= (map->getTile(c) == wall);
}
return collision;
}
// Mueve al jugador en función de la velocidad/desplazamiento
void Player::move()
{
const float old_x = x;
x += vx;
updateColliders();
if (checkMapCollisions())
{
x = old_x;
}
const float old_y = y;
y += vy;
updateColliders();
if (checkMapCollisions())
{
y = old_y;
}
sprite->setPosX(x);
sprite->setPosY(y);
sprite->update();
}