migrat correctament a delta_time credits.cpp i eliminat un bug que feia que si no pasaves a ma el final, no acabara mai

This commit is contained in:
2025-10-24 10:10:55 +02:00
parent 1c3d59d678
commit 4b732c189c
3 changed files with 46 additions and 36 deletions

View File

@@ -44,7 +44,7 @@ Director::Director(int argc, std::span<char*> argv) {
Section::name = Section::Name::GAME; Section::name = Section::Name::GAME;
Section::options = Section::Options::GAME_PLAY_1P; Section::options = Section::Options::GAME_PLAY_1P;
#elif _DEBUG #elif _DEBUG
Section::name = Section::Name::HI_SCORE_TABLE; Section::name = Section::Name::CREDITS;
Section::options = Section::Options::GAME_PLAY_1P; Section::options = Section::Options::GAME_PLAY_1P;
#else // NORMAL GAME #else // NORMAL GAME
Section::name = Section::Name::LOGO; Section::name = Section::Name::LOGO;

View File

@@ -82,7 +82,7 @@ void Credits::run() {
} }
} }
// Actualiza las variables (time-based) // Actualiza las variables (time-based puro - sin conversión frame-based)
void Credits::update(float delta_time) { void Credits::update(float delta_time) {
const float MULTIPLIER = want_to_pass_ ? FAST_FORWARD_MULTIPLIER : 1.0F; const float MULTIPLIER = want_to_pass_ ? FAST_FORWARD_MULTIPLIER : 1.0F;
const float ADJUSTED_DELTA_TIME = delta_time * MULTIPLIER; const float ADJUSTED_DELTA_TIME = delta_time * MULTIPLIER;
@@ -99,10 +99,6 @@ void Credits::update(float delta_time) {
updatePlayers(ADJUSTED_DELTA_TIME); updatePlayers(ADJUSTED_DELTA_TIME);
updateAllFades(ADJUSTED_DELTA_TIME); updateAllFades(ADJUSTED_DELTA_TIME);
// Convertir deltaTime a equivalente de frames (60fps)
const float FRAME_FACTOR = ADJUSTED_DELTA_TIME * 60.0F;
counter_ += FRAME_FACTOR;
fillCanvas(); fillCanvas();
} }
@@ -270,7 +266,7 @@ void Credits::fillCanvas() {
SDL_SetRenderTarget(Screen::get()->getRenderer(), temp); SDL_SetRenderTarget(Screen::get()->getRenderer(), temp);
} }
// Actualiza el destino de los rectangulos de las texturas (time-based) // Actualiza el destino de los rectangulos de las texturas (time-based puro)
void Credits::updateTextureDstRects(float delta_time) { void Credits::updateTextureDstRects(float delta_time) {
constexpr float TEXTURE_UPDATE_INTERVAL_S = 10.0F / 60.0F; // ~0.167s (cada 10 frames) constexpr float TEXTURE_UPDATE_INTERVAL_S = 10.0F / 60.0F; // ~0.167s (cada 10 frames)
credits_state_.texture_accumulator += delta_time; credits_state_.texture_accumulator += delta_time;
@@ -284,34 +280,45 @@ void Credits::updateTextureDstRects(float delta_time) {
} }
// Comprueba la posición de la textura con el mini_logo // Comprueba la posición de la textura con el mini_logo
if (mini_logo_rect_dst_.y == mini_logo_final_pos_) { if (mini_logo_rect_dst_.y <= static_cast<float>(mini_logo_final_pos_)) {
// Forzar posición exacta para evitar problemas de comparación float
mini_logo_rect_dst_.y = static_cast<float>(mini_logo_final_pos_);
mini_logo_on_position_ = true; mini_logo_on_position_ = true;
// Si el jugador quiere pasar los titulos de credito, el fade se inicia solo
if (want_to_pass_) {
fading_ = true;
}
// Se activa el contador para evitar que la sección sea infinita
if (counter_prevent_endless_ == 1000) {
fading_ = true;
} else {
++counter_prevent_endless_;
}
} else { } else {
--mini_logo_rect_dst_.y; --mini_logo_rect_dst_.y;
} }
} }
// Acumular tiempo desde que el logo llegó a su posición (fuera del if para que se ejecute cada frame)
if (mini_logo_on_position_) {
time_since_logo_positioned_ += delta_time;
// Timeout para evitar que la sección sea infinita
if (time_since_logo_positioned_ >= MAX_TIME_AFTER_LOGO_S) {
fading_ = true;
}
// Si el jugador quiere pasar los titulos de credito, el fade se inicia solo
if (want_to_pass_) {
fading_ = true;
}
}
} }
// Tira globos al escenario (time-based) // Tira globos al escenario (time-based puro)
void Credits::throwBalloons(float delta_time) { void Credits::throwBalloons(float delta_time) {
constexpr int SPEED = 200; constexpr int SPEED = 200;
constexpr size_t NUM_SETS = 8; // Tamaño del vector SETS
const std::vector<int> SETS = {0, 63, 25, 67, 17, 75, 13, 50}; const std::vector<int> SETS = {0, 63, 25, 67, 17, 75, 13, 50};
constexpr float BALLOON_INTERVAL_S = SPEED / 60.0F; // ~3.33s (cada 200 frames) constexpr float BALLOON_INTERVAL_S = SPEED / 60.0F; // ~3.33s (cada 200 frames)
constexpr float POWERBALL_INTERVAL_S = (SPEED * 4) / 60.0F; // ~13.33s (cada 800 frames) constexpr float POWERBALL_INTERVAL_S = (SPEED * 4) / 60.0F; // ~13.33s (cada 800 frames)
constexpr float MAX_BALLOON_TIME_S = ((NUM_SETS - 1) * SPEED * 3) / 60.0F; // Tiempo máximo para lanzar globos
if (counter_ > ((SETS.size() - 1) * SPEED) * 3) { // Acumular tiempo total de globos
elapsed_time_balloons_ += delta_time;
// Detener lanzamiento después del tiempo límite
if (elapsed_time_balloons_ > MAX_BALLOON_TIME_S) {
return; return;
} }
@@ -320,11 +327,11 @@ void Credits::throwBalloons(float delta_time) {
if (credits_state_.balloon_accumulator >= BALLOON_INTERVAL_S) { if (credits_state_.balloon_accumulator >= BALLOON_INTERVAL_S) {
credits_state_.balloon_accumulator -= BALLOON_INTERVAL_S; credits_state_.balloon_accumulator -= BALLOON_INTERVAL_S;
const int INDEX = (static_cast<int>(counter_ / SPEED)) % SETS.size(); const int INDEX = (static_cast<int>(elapsed_time_balloons_ * 60.0F / SPEED)) % SETS.size();
balloon_manager_->deployFormation(SETS.at(INDEX), -60); balloon_manager_->deployFormation(SETS.at(INDEX), -60);
} }
if (credits_state_.powerball_accumulator >= POWERBALL_INTERVAL_S && counter_ > 0) { if (credits_state_.powerball_accumulator >= POWERBALL_INTERVAL_S && elapsed_time_balloons_ > 0.0F) {
credits_state_.powerball_accumulator -= POWERBALL_INTERVAL_S; credits_state_.powerball_accumulator -= POWERBALL_INTERVAL_S;
balloon_manager_->createPowerBall(); balloon_manager_->createPowerBall();
} }
@@ -485,11 +492,12 @@ void Credits::updateBlackRects(float delta_time) {
// Fase final: ya completado el movimiento de rects // Fase final: ya completado el movimiento de rects
Audio::get()->setMusicVolume(0); Audio::get()->setMusicVolume(0);
// Audio::get()->stopMusic(); // opcional, si quieres parar la reproducción // Audio::get()->stopMusic(); // opcional, si quieres parar la reproducción
if (counter_pre_fade_ >= 400.0f) {
// Usar segundos puros en lugar de frames equivalentes
if (counter_pre_fade_ >= PRE_FADE_DELAY_S) {
if (fade_out_) fade_out_->activate(); if (fade_out_) fade_out_->activate();
} else { } else {
const float frame_increment = delta_time * FRAMES_PER_SECOND; counter_pre_fade_ += delta_time;
counter_pre_fade_ += frame_increment;
} }
} }

View File

@@ -32,12 +32,14 @@ class Credits {
void initVars(); // Inicializa variables void initVars(); // Inicializa variables
void startCredits(); // Inicializa mas variables void startCredits(); // Inicializa mas variables
// --- Constantes de clase --- // --- Constantes de clase (time-based) ---
static constexpr int PLAY_AREA_HEIGHT = 200; static constexpr int PLAY_AREA_HEIGHT = 200;
static constexpr float FAST_FORWARD_MULTIPLIER = 6.0F; static constexpr float FAST_FORWARD_MULTIPLIER = 6.0F;
static constexpr float BLACK_RECT_INTERVAL_S = 4.0F / 60.0F; // ~0.0667s static constexpr float BLACK_RECT_INTERVAL_S = 4.0F / 60.0F; // ~0.0667s (cada 4 frames a 60fps)
static constexpr float FRAMES_PER_SECOND = 60.0F; static constexpr float FRAMES_PER_SECOND = 60.0F;
static constexpr int HORIZONTAL_SPEED = 2; static constexpr int HORIZONTAL_SPEED = 2;
static constexpr float MAX_TIME_AFTER_LOGO_S = 1000.0F / 60.0F; // ~16.67s (límite para evitar bucle infinito)
static constexpr float PRE_FADE_DELAY_S = 400.0F / 60.0F; // ~6.67s (retraso antes del fade final)
// --- Objetos principales --- // --- Objetos principales ---
std::unique_ptr<BalloonManager> balloon_manager_; // Gestión de globos std::unique_ptr<BalloonManager> balloon_manager_; // Gestión de globos
@@ -50,11 +52,11 @@ class Credits {
SDL_Texture* text_texture_; // Textura con el texto de créditos SDL_Texture* text_texture_; // Textura con el texto de créditos
SDL_Texture* canvas_; // Textura donde se dibuja todo SDL_Texture* canvas_; // Textura donde se dibuja todo
// --- Temporización y contadores --- // --- Temporización (time-based puro) ---
Uint64 last_time_ = 0; // Último tiempo registrado para deltaTime Uint64 last_time_ = 0; // Último tiempo registrado para deltaTime
float counter_ = 0.0F; // Contador principal de lógica float elapsed_time_balloons_ = 0.0F; // Tiempo acumulado para lanzamiento de globos (segundos)
float counter_pre_fade_ = 0.0F; // Activación del fundido final float counter_pre_fade_ = 0.0F; // Tiempo antes de activar fundido final (segundos)
float counter_prevent_endless_ = 0.0F; // Prevención de bucle infinito float time_since_logo_positioned_ = 0.0F; // Tiempo desde que el logo llegó a su posición (segundos)
float current_step_ = 0.0F; float current_step_ = 0.0F;
int total_steps_ = 1; int total_steps_ = 1;
bool initialized_ = false; bool initialized_ = false;