ACABADA LA LOGICA DE PLAYER! es pot refactoritzar i falta els casos on Player puga avançar mes de un pixel en un frame

This commit is contained in:
2025-11-15 22:45:18 +01:00
parent 710e7cc8c1
commit e4c10b6b75
2 changed files with 25 additions and 23 deletions

View File

@@ -82,6 +82,8 @@ void Player::move(float delta_time) {
break;
}
syncSpriteAndCollider(); // Actualiza la posición del sprite y las colisiones
Debug::get()->add(std::string("X: " + std::to_string(static_cast<int>(x_))));
Debug::get()->add(std::string("Y: " + std::to_string(static_cast<int>(y_))));
}
void Player::handleConveyorBelts() {
@@ -237,6 +239,9 @@ void Player::moveOnGround(float delta_time) {
y_ = SLOPE_Y - HEIGHT;
transitionToState(State::ON_SLOPE);
}
// Comprueba si está sobre una rampa
if (isOnSlope()) { transitionToState(State::ON_SLOPE); }
}
// Movimiento físico del estado ON_SLOPE
@@ -275,50 +280,46 @@ void Player::moveOnSlope(float delta_time) {
}
}
// Actualizar posición de los pies para cálculos
updateFeet();
// Seleccionar el pie apropiado según el tipo de rampa
// Left slopes (forma \) colisionan con el pie izquierdo
// Right slopes (forma /) colisionan con el pie derecho
const float FOOT_X = IS_LEFT_SLOPE ? under_left_foot_.x : under_right_foot_.x;
const int X = IS_LEFT_SLOPE ? x_ : x_ + WIDTH - 1;
// Calcular la Y del pie basado en la ecuación de la rampa (45 grados)
// Calcular la Y basada en la ecuación de la rampa (45 grados)
// Left slope (\): y aumenta con x -> y = y1 + (x - x1)
// Right slope (/): y disminuye con x -> y = y1 - (x - x1)
float foot_y = 0.0F;
if (IS_LEFT_SLOPE) {
foot_y = current_slope_->y1 + (FOOT_X - current_slope_->x1);
y_ = current_slope_->y1 + (X - current_slope_->x1) - HEIGHT;
} else {
foot_y = current_slope_->y1 - (FOOT_X - current_slope_->x1);
y_ = current_slope_->y1 - (X - current_slope_->x1) - HEIGHT;
}
// Ajustar la posición Y del jugador (restar HEIGHT porque foot_y es la posición del pie)
y_ = foot_y - HEIGHT + 1;
// Verificar si el pie ha salido de los límites horizontales de la rampa
// Usar min/max porque LEFT slopes tienen x1<x2 pero RIGHT slopes tienen x1>x2
const int MIN_X = std::min(current_slope_->x1, current_slope_->x2);
const int MAX_X = std::max(current_slope_->x1, current_slope_->x2);
const bool OUT_OF_BOUNDS = (FOOT_X < MIN_X) || (FOOT_X > MAX_X);
const bool OUT_OF_BOUNDS = (X < MIN_X) || (X > MAX_X);
if (OUT_OF_BOUNDS) {
// Determinar si estamos saliendo por arriba o por abajo de la rampa
const bool EXITING_DOWNWARD = (FOOT_X > current_slope_->x2 && IS_LEFT_SLOPE) ||
(FOOT_X < current_slope_->x1 && !IS_LEFT_SLOPE);
const bool EXITING_DOWNWARD = (X > current_slope_->x2 && IS_LEFT_SLOPE) ||
(X < current_slope_->x1 && !IS_LEFT_SLOPE);
const bool EXITING_UPWARD = (X < current_slope_->x1 && IS_LEFT_SLOPE) ||
(X > current_slope_->x2 && !IS_LEFT_SLOPE);
if (EXITING_DOWNWARD) {
// Salida por abajo: bajar 1 pixel para ayudar detección de suelo
// Salida por abajo: no hacer nada
// y_ += 1.0F;
}
// Si sale por arriba, mantener altura (ya está en foot_y - HEIGHT)
// El jugador ya no está en la rampa, limpiar referencia
// current_slope_ = nullptr;
if (EXITING_UPWARD) {
// Salida por arriba: bajar un pixel ya que ha subido 1 de mas al salirse de la recta
y_ += 1.0F;
}
// Verificar si hay soporte debajo (suelo plano, conveyor belt, u otra slope)
if (isOnFloor()) {
// Hay soporte: transición a ON_GROUND (podría ser superficie, conveyor u otra rampa)
// Verificar si hay soporte debajo (suelo plano o conveyor belt)
if (isOnTopSurface() || isOnConveyorBelt()) {
// Hay soporte: transición a ON_GROUND (podría ser superficie o conveyor belt)
transitionToState(State::ON_GROUND);
} else {
// Sin soporte: empezar a caer
@@ -328,10 +329,10 @@ void Player::moveOnSlope(float delta_time) {
}
// Verificar transición a superficie plana
if (isOnTopSurface()) {
/*if (isOnTopSurface()) {
transitionToState(State::ON_GROUND);
return;
}
}*/
}
// Movimiento físico del estado JUMPING

View File

@@ -226,6 +226,7 @@ void Game::handleDebugEvents(const SDL_Event& event) {
Notifier::get()->show({"DEBUG " + std::string(Debug::get()->isEnabled() ? "ENABLED" : "DISABLED")}, Notifier::TextAlign::CENTER);
room_->redrawMap(); // Redibuja el tilemap para mostrar/ocultar líneas de colisión
Options::cheats.invincible = static_cast<Options::Cheat::State>(Debug::get()->isEnabled());
player_->setColor();
board_->music = !Debug::get()->isEnabled();
board_->music ? Audio::get()->resumeMusic() : Audio::get()->pauseMusic();
break;