delta-time: game.cpp (funciona pero va un poc massa ràpid)

This commit is contained in:
2025-09-16 22:56:00 +02:00
parent 3e6cc9dfab
commit 66566913f6
3 changed files with 93 additions and 27 deletions

View File

@@ -210,7 +210,7 @@ void Game::updateHiScore() {
}
}
// Actualiza las variables del jugador
// Actualiza las variables del jugador (frame-based)
void Game::updatePlayers() {
for (auto &player : players_) {
player->update();
@@ -246,6 +246,42 @@ void Game::updatePlayers() {
sortPlayersByZOrder();
}
// Actualiza las variables del jugador (time-based)
void Game::updatePlayers(float deltaTime) {
for (auto &player : players_) {
player->update(deltaTime);
if (player->isPlaying()) {
// Comprueba la colisión entre el jugador y los globos
auto balloon = checkPlayerBalloonCollision(player);
// Si hay colisión
if (balloon) {
// Si el globo está parado y el temporizador activo, lo explota
if (balloon->isStopped() && time_stopped_counter_ > 0) {
balloon_manager_->popBalloon(balloon);
}
// En caso contrario, el jugador ha sido golpeado por un globo activo
else {
handlePlayerCollision(player, balloon);
if (demo_.enabled && allPlayersAreNotPlaying()) {
fade_out_->setType(Fade::Type::RANDOM_SQUARE2);
fade_out_->setPostDuration(500);
fade_out_->activate();
}
}
}
// Comprueba las colisiones entre el jugador y los items
checkPlayerItemCollision(player);
}
}
// Organiza la lista de jugadores
sortPlayersByZOrder();
}
// Dibuja a los jugadores
void Game::renderPlayers() {
for (auto &player : players_) {
@@ -892,14 +928,14 @@ void Game::updateTimeStopped() {
if (time_stopped_counter_ > 0) {
time_stopped_counter_--;
if (time_stopped_counter_ > 120) {
if (time_stopped_counter_ % 30 == 0) {
if (static_cast<int>(time_stopped_counter_) % 30 == 0) {
playSound("clock.wav");
}
} else {
if (time_stopped_counter_ % 30 == 0) {
if (static_cast<int>(time_stopped_counter_) % 30 == 0) {
balloon_manager_->normalColorsToAllBalloons();
playSound("clock.wav");
} else if (time_stopped_counter_ % 30 == 15) {
} else if (static_cast<int>(time_stopped_counter_) % 30 == 15) {
balloon_manager_->reverseColorsToAllBalloons();
playSound("clock.wav");
}
@@ -909,9 +945,10 @@ void Game::updateTimeStopped() {
}
}
// Actualiza toda la lógica del juego (frame-based)
void Game::update() {
if (SDL_GetTicks() - ticks_ > param.game.speed) {
ticks_ = SDL_GetTicks();
if (SDL_GetTicks() - last_time_ > param.game.speed) {
last_time_ = SDL_GetTicks();
screen_->update();
updateDemo();
@@ -925,6 +962,20 @@ void Game::update() {
Audio::update();
}
// Actualiza toda la lógica del juego (time-based)
void Game::update(float deltaTime) {
screen_->update();
updateDemo();
#ifdef RECORDING
updateRecording();
#endif
updateGameStates();
fillCanvas();
Audio::update();
}
// Dibuja el juego
void Game::render() {
screen_->start(); // Prepara para empezar a dibujar en la textura de juego
@@ -1006,13 +1057,24 @@ void Game::disableTimeStopItem() {
balloon_manager_->normalColorsToAllBalloons();
}
// Calcula el deltatime
auto Game::calculateDeltaTime() -> float {
const Uint64 current_time = SDL_GetTicks();
const float delta_time = static_cast<float>(current_time - last_time_);
last_time_ = current_time;
return delta_time;
}
// Bucle para el juego
void Game::run() {
last_time_ = SDL_GetTicks();
while (Section::name == Section::Name::GAME) {
#ifndef RECORDING
checkInput();
#endif
update();
const float delta_time = calculateDeltaTime();
update(delta_time);
handleEvents(); // Tiene que ir antes del render
render();
}