#include "game/entities/player.hpp" #include #include #include "core/resources/resource_cache.hpp" #include "utils/defines.hpp" namespace { // Velocitat constant. Si més endavant volem sprint, slow zones, etc., // es pot convertir en un membre modificable. constexpr float SPEED_PX_PER_S = 60.0F; } // namespace Player::Player(float x, float y, const Controls& controls) : AnimatedSprite(Resource::Cache::get().getAnimationData("player.yaml")), controls_(controls) { setPos(x, y); setCurrentAnimation("stand"); } void Player::update(float delta_time) { const bool* keys = SDL_GetKeyboardState(nullptr); float vx = 0.0F; float vy = 0.0F; if (keys[controls_.left]) { vx -= SPEED_PX_PER_S; } if (keys[controls_.right]) { vx += SPEED_PX_PER_S; } if (keys[controls_.up]) { vy -= SPEED_PX_PER_S; } if (keys[controls_.down]) { vy += SPEED_PX_PER_S; } setVelX(vx); setVelY(vy); // El sprite original mira a la dreta; flipem només si es mou a l'esquerra // i restaurem si torna a la dreta. Moviments purament verticals conserven // l'últim flip perquè el jugador no "gire" sense motiu. if (vx < 0.0F) { setFlip(SDL_FLIP_HORIZONTAL); } else if (vx > 0.0F) { setFlip(SDL_FLIP_NONE); } const bool MOVING = vx != 0.0F || vy != 0.0F; setCurrentAnimation(MOVING ? "walk" : "stand"); AnimatedSprite::update(delta_time); // Límits de pantalla amb perspectiva falsa: el cap (12px superiors) pot // quedar fora per dalt; els peus (12×12 inferiors) sempre dins del canvas. constexpr auto MIN_X = 0.0F; constexpr auto MAX_X = static_cast(GameCanvas::WIDTH - SPRITE_WIDTH); constexpr auto MIN_Y = -static_cast(SPRITE_HEIGHT - COLLISION_HEIGHT); constexpr auto MAX_Y = static_cast(GameCanvas::HEIGHT - SPRITE_HEIGHT); setPosX(std::clamp(getPosX(), MIN_X, MAX_X)); setPosY(std::clamp(getPosY(), MIN_Y, MAX_Y)); }