migrat Scoreboard a time based
This commit is contained in:
@@ -30,8 +30,6 @@ Scoreboard::Scoreboard(std::shared_ptr<ScoreboardData> data)
|
|||||||
surface_dest_ = {.x = 0, .y = Options::game.height - SURFACE_HEIGHT, .w = SURFACE_WIDTH, .h = SURFACE_HEIGHT};
|
surface_dest_ = {.x = 0, .y = Options::game.height - SURFACE_HEIGHT, .w = SURFACE_WIDTH, .h = SURFACE_HEIGHT};
|
||||||
|
|
||||||
// Inicializa las variables
|
// Inicializa las variables
|
||||||
counter_ = 0;
|
|
||||||
change_color_speed_ = 4;
|
|
||||||
is_paused_ = false;
|
is_paused_ = false;
|
||||||
paused_time_ = 0;
|
paused_time_ = 0;
|
||||||
paused_time_elapsed_ = 0;
|
paused_time_elapsed_ = 0;
|
||||||
@@ -50,12 +48,15 @@ void Scoreboard::render() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Actualiza las variables del objeto
|
// Actualiza las variables del objeto
|
||||||
void Scoreboard::update() {
|
void Scoreboard::update(float delta_time) {
|
||||||
counter_++;
|
// Acumular tiempo para animaciones
|
||||||
player_sprite_->update();
|
time_accumulator_ += delta_time;
|
||||||
|
|
||||||
|
// Actualizar sprite con delta time
|
||||||
|
player_sprite_->update(delta_time);
|
||||||
|
|
||||||
// Actualiza el color de la cantidad de items recogidos
|
// Actualiza el color de la cantidad de items recogidos
|
||||||
updateItemsColor();
|
updateItemsColor(delta_time);
|
||||||
|
|
||||||
// Dibuja la textura
|
// Dibuja la textura
|
||||||
fillTexture();
|
fillTexture();
|
||||||
@@ -98,12 +99,20 @@ void Scoreboard::setPaused(bool value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Actualiza el color de la cantidad de items recogidos
|
// Actualiza el color de la cantidad de items recogidos
|
||||||
void Scoreboard::updateItemsColor() {
|
void Scoreboard::updateItemsColor(float delta_time) {
|
||||||
if (!data_->jail_is_open) {
|
if (!data_->jail_is_open) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (counter_ % 20 < 10) {
|
items_color_timer_ += delta_time;
|
||||||
|
|
||||||
|
// Resetear timer cada 2 ciclos (0.666s total)
|
||||||
|
if (items_color_timer_ >= ITEMS_COLOR_BLINK_DURATION * 2.0F) {
|
||||||
|
items_color_timer_ = 0.0F;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Alternar color cada ITEMS_COLOR_BLINK_DURATION
|
||||||
|
if (items_color_timer_ < ITEMS_COLOR_BLINK_DURATION) {
|
||||||
items_color_ = stringToColor("white");
|
items_color_ = stringToColor("white");
|
||||||
} else {
|
} else {
|
||||||
items_color_ = stringToColor("magenta");
|
items_color_ = stringToColor("magenta");
|
||||||
@@ -129,8 +138,9 @@ void Scoreboard::fillTexture() {
|
|||||||
constexpr int LINE2 = 3 * TILE_SIZE;
|
constexpr int LINE2 = 3 * TILE_SIZE;
|
||||||
|
|
||||||
// Dibuja las vidas
|
// Dibuja las vidas
|
||||||
const int DESP = (counter_ / 40) % 8;
|
// Calcular desplazamiento basado en tiempo
|
||||||
const int FRAME = DESP % 4;
|
const int DESP = static_cast<int>(time_accumulator_ / SPRITE_WALK_CYCLE_DURATION) % 8;
|
||||||
|
const int FRAME = DESP % SPRITE_WALK_FRAMES;
|
||||||
player_sprite_->setCurrentAnimationFrame(FRAME);
|
player_sprite_->setCurrentAnimationFrame(FRAME);
|
||||||
player_sprite_->setPosY(LINE2);
|
player_sprite_->setPosY(LINE2);
|
||||||
for (int i = 0; i < data_->lives; ++i) {
|
for (int i = 0; i < data_->lives; ++i) {
|
||||||
|
|||||||
@@ -68,22 +68,27 @@ class Scoreboard {
|
|||||||
std::shared_ptr<ScoreboardData> data_; // Contiene las variables a mostrar en el marcador
|
std::shared_ptr<ScoreboardData> data_; // Contiene las variables a mostrar en el marcador
|
||||||
std::shared_ptr<Surface> surface_; // Surface donde dibujar el marcador;
|
std::shared_ptr<Surface> surface_; // Surface donde dibujar el marcador;
|
||||||
|
|
||||||
|
// Constantes de tiempo
|
||||||
|
static constexpr float ITEMS_COLOR_BLINK_DURATION = 0.333F; // Duración de cada estado del parpadeo (era 10 frames @ 60fps)
|
||||||
|
static constexpr float SPRITE_WALK_CYCLE_DURATION = 0.667F; // Duración del ciclo de caminar (era 40 frames @ 60fps)
|
||||||
|
static constexpr int SPRITE_WALK_FRAMES = 4; // Número de frames de animación
|
||||||
|
|
||||||
// Variables
|
// Variables
|
||||||
std::vector<Uint8> color_; // Vector con los colores del objeto
|
std::vector<Uint8> color_; // Vector con los colores del objeto
|
||||||
int counter_; // Contador interno
|
|
||||||
int change_color_speed_; // Cuanto mas alto, mas tarda en cambiar de color
|
|
||||||
bool is_paused_; // Indica si el marcador esta en modo pausa
|
bool is_paused_; // Indica si el marcador esta en modo pausa
|
||||||
Uint32 paused_time_; // Milisegundos que ha estado el marcador en pausa
|
Uint32 paused_time_; // Milisegundos que ha estado el marcador en pausa
|
||||||
Uint32 paused_time_elapsed_; // Tiempo acumulado en pausa
|
Uint32 paused_time_elapsed_; // Tiempo acumulado en pausa
|
||||||
ClockData clock_; // Contiene las horas, minutos y segundos transcurridos desde el inicio de la partida
|
ClockData clock_; // Contiene las horas, minutos y segundos transcurridos desde el inicio de la partida
|
||||||
Uint8 items_color_; // Color de la cantidad de items recogidos
|
Uint8 items_color_; // Color de la cantidad de items recogidos
|
||||||
SDL_FRect surface_dest_; // Rectangulo donde dibujar la surface del marcador
|
SDL_FRect surface_dest_; // Rectangulo donde dibujar la surface del marcador
|
||||||
|
float time_accumulator_ = 0.0F; // Acumulador de tiempo para animaciones
|
||||||
|
float items_color_timer_ = 0.0F; // Timer para parpadeo de color de items
|
||||||
|
|
||||||
// Obtiene el tiempo transcurrido de partida
|
// Obtiene el tiempo transcurrido de partida
|
||||||
auto getTime() -> ClockData;
|
auto getTime() -> ClockData;
|
||||||
|
|
||||||
// Actualiza el color de la cantidad de items recogidos
|
// Actualiza el color de la cantidad de items recogidos
|
||||||
void updateItemsColor();
|
void updateItemsColor(float delta_time);
|
||||||
|
|
||||||
// Dibuja los elementos del marcador en la surface
|
// Dibuja los elementos del marcador en la surface
|
||||||
void fillTexture();
|
void fillTexture();
|
||||||
@@ -99,7 +104,7 @@ class Scoreboard {
|
|||||||
void render();
|
void render();
|
||||||
|
|
||||||
// Actualiza las variables del objeto
|
// Actualiza las variables del objeto
|
||||||
void update();
|
void update(float delta_time);
|
||||||
|
|
||||||
// Pone el marcador en modo pausa
|
// Pone el marcador en modo pausa
|
||||||
void setPaused(bool value);
|
void setPaused(bool value);
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ enum class Options {
|
|||||||
|
|
||||||
// --- Variables de estado globales ---
|
// --- Variables de estado globales ---
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
inline Scene current = Scene::ENDING2; // Escena actual
|
inline Scene current = Scene::GAME; // Escena actual
|
||||||
inline Options options = Options::LOGO_TO_LOADING_SCREEN; // Opciones de la escena actual
|
inline Options options = Options::LOGO_TO_LOADING_SCREEN; // Opciones de la escena actual
|
||||||
#else
|
#else
|
||||||
inline Scene current = Scene::LOGO; // Escena actual
|
inline Scene current = Scene::LOGO; // Escena actual
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ void Game::update() {
|
|||||||
checkSomeCheevos();
|
checkSomeCheevos();
|
||||||
}
|
}
|
||||||
demoCheckRoomChange(DELTA_TIME);
|
demoCheckRoomChange(DELTA_TIME);
|
||||||
scoreboard_->update();
|
scoreboard_->update(DELTA_TIME);
|
||||||
keepMusicPlaying();
|
keepMusicPlaying();
|
||||||
updateBlackScreen(DELTA_TIME);
|
updateBlackScreen(DELTA_TIME);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user