forked from jaildesigner-jailgames/jaildoctors_dilemma
optimitzada la marquesina de Title
This commit is contained in:
@@ -26,6 +26,9 @@ Title::Title()
|
|||||||
loading_screen_sprite_(std::make_shared<SurfaceSprite>(loading_screen_surface_, 0, 0, loading_screen_surface_->getWidth(), loading_screen_surface_->getHeight())),
|
loading_screen_sprite_(std::make_shared<SurfaceSprite>(loading_screen_surface_, 0, 0, loading_screen_surface_->getWidth(), loading_screen_surface_->getHeight())),
|
||||||
bg_surface_(std::make_shared<Surface>(Options::game.width, Options::game.height)),
|
bg_surface_(std::make_shared<Surface>(Options::game.width, Options::game.height)),
|
||||||
delta_timer_(std::make_unique<DeltaTimer>()),
|
delta_timer_(std::make_unique<DeltaTimer>()),
|
||||||
|
marquee_text_(Resource::get()->getText("gauntlet")),
|
||||||
|
first_active_letter_(0),
|
||||||
|
last_active_letter_(0),
|
||||||
state_time_(0.0f),
|
state_time_(0.0f),
|
||||||
fade_accumulator_(0.0f),
|
fade_accumulator_(0.0f),
|
||||||
current_delta_(0.0f) {
|
current_delta_(0.0f) {
|
||||||
@@ -52,14 +55,20 @@ Title::Title()
|
|||||||
void Title::initMarquee() {
|
void Title::initMarquee() {
|
||||||
letters_.clear();
|
letters_.clear();
|
||||||
long_text_ = "HEY JAILERS!! IT'S 2022 AND WE'RE STILL ROCKING LIKE IT'S 1998!!! HAVE YOU HEARD IT? JAILGAMES ARE BACK!! YEEESSS BACK!! MORE THAN 10 TITLES ON JAILDOC'S KITCHEN!! THATS A LOOOOOOT OF JAILGAMES, BUT WHICH ONE WILL STRIKE FIRST? THERE IS ALSO A NEW DEVICE TO COME THAT WILL BLOW YOUR MIND WITH JAILGAMES ON THE GO: P.A.C.O. BUT WAIT! WHAT'S THAT BEAUTY I'M SEEING RIGHT OVER THERE?? OOOH THAT TINY MINIASCII IS PURE LOVE!! I WANT TO LICK EVERY BYTE OF IT!! OH SHIT! AND DON'T FORGET TO BRING BACK THOSE OLD AND FAT MS-DOS JAILGAMES TO GITHUB TO KEEP THEM ALIVE!! WHAT WILL BE THE NEXT JAILDOC RELEASE? WHAT WILL BE THE NEXT PROJECT TO COME ALIVE?? OH BABY WE DON'T KNOW BUT HERE YOU CAN FIND THE ANSWER, YOU JUST HAVE TO COMPLETE JAILDOCTOR'S DILEMMA ... COULD YOU?";
|
long_text_ = "HEY JAILERS!! IT'S 2022 AND WE'RE STILL ROCKING LIKE IT'S 1998!!! HAVE YOU HEARD IT? JAILGAMES ARE BACK!! YEEESSS BACK!! MORE THAN 10 TITLES ON JAILDOC'S KITCHEN!! THATS A LOOOOOOT OF JAILGAMES, BUT WHICH ONE WILL STRIKE FIRST? THERE IS ALSO A NEW DEVICE TO COME THAT WILL BLOW YOUR MIND WITH JAILGAMES ON THE GO: P.A.C.O. BUT WAIT! WHAT'S THAT BEAUTY I'M SEEING RIGHT OVER THERE?? OOOH THAT TINY MINIASCII IS PURE LOVE!! I WANT TO LICK EVERY BYTE OF IT!! OH SHIT! AND DON'T FORGET TO BRING BACK THOSE OLD AND FAT MS-DOS JAILGAMES TO GITHUB TO KEEP THEM ALIVE!! WHAT WILL BE THE NEXT JAILDOC RELEASE? WHAT WILL BE THE NEXT PROJECT TO COME ALIVE?? OH BABY WE DON'T KNOW BUT HERE YOU CAN FIND THE ANSWER, YOU JUST HAVE TO COMPLETE JAILDOCTOR'S DILEMMA ... COULD YOU?";
|
||||||
for (int i = 0; i < (int)long_text_.length(); ++i) {
|
|
||||||
|
// Pre-calcular anchos de caracteres para eficiencia
|
||||||
|
for (size_t i = 0; i < long_text_.length(); ++i) {
|
||||||
TitleLetter l;
|
TitleLetter l;
|
||||||
l.letter = long_text_.substr(i, 1);
|
l.letter = long_text_[i]; // char directo, no substring
|
||||||
l.x = 256.0f;
|
l.x = MARQUEE_START_X; // Usar constante
|
||||||
|
l.width = marquee_text_->lenght(std::string(1, long_text_[i])); // Pre-calcular ancho
|
||||||
l.enabled = false;
|
l.enabled = false;
|
||||||
letters_.push_back(l);
|
letters_.push_back(l);
|
||||||
}
|
}
|
||||||
|
|
||||||
letters_[0].enabled = true;
|
letters_[0].enabled = true;
|
||||||
|
first_active_letter_ = 0;
|
||||||
|
last_active_letter_ = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba el manejador de eventos
|
// Comprueba el manejador de eventos
|
||||||
@@ -112,36 +121,48 @@ void Title::checkInput() {
|
|||||||
|
|
||||||
// Actualiza la marquesina
|
// Actualiza la marquesina
|
||||||
void Title::updateMarquee(float delta_time) {
|
void Title::updateMarquee(float delta_time) {
|
||||||
const auto TEXT = Resource::get()->getText("gauntlet");
|
|
||||||
const float displacement = MARQUEE_SPEED * delta_time;
|
const float displacement = MARQUEE_SPEED * delta_time;
|
||||||
|
|
||||||
for (int i = 0; i < (int)letters_.size(); ++i) {
|
// Solo procesar letras en rango activo + 1 para poder activar la siguiente
|
||||||
if (letters_[i].enabled) {
|
for (int i = first_active_letter_; i <= last_active_letter_ + 1 && i < (int)letters_.size(); ++i) {
|
||||||
letters_[i].x -= displacement;
|
auto& letter = letters_[i];
|
||||||
if (letters_[i].x < -10.0f) {
|
|
||||||
letters_[i].enabled = false;
|
if (letter.enabled) {
|
||||||
}
|
letter.x -= displacement;
|
||||||
} else {
|
|
||||||
if (i > 0 && letters_[i - 1].x < 256.0f && letters_[i - 1].enabled) {
|
// Desactivar si sale de pantalla
|
||||||
letters_[i].enabled = true;
|
if (letter.x < MARQUEE_EXIT_X) {
|
||||||
letters_[i].x = letters_[i - 1].x + TEXT->lenght(letters_[i - 1].letter) + 1.0f;
|
letter.enabled = false;
|
||||||
|
if (i == first_active_letter_) {
|
||||||
|
first_active_letter_++; // Avanzar inicio del rango
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else if (i > 0 && letters_[i - 1].x < MARQUEE_START_X && letters_[i - 1].enabled) {
|
||||||
|
// Activar siguiente letra usando ancho pre-calculado
|
||||||
|
letter.enabled = true;
|
||||||
|
letter.x = letters_[i - 1].x + letters_[i - 1].width + MARQUEE_LETTER_SPACING;
|
||||||
|
last_active_letter_ = i; // Expandir fin del rango
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Comprueba si ha terminado la marquesina y la reinicia
|
// Comprueba si ha terminado la marquesina y la reinicia
|
||||||
if (letters_[letters_.size() - 1].x < -10.0f) {
|
if (letters_[letters_.size() - 1].x < MARQUEE_EXIT_X) {
|
||||||
// Inicializa la marquesina
|
|
||||||
initMarquee();
|
initMarquee();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dibuja la marquesina
|
// Dibuja la marquesina
|
||||||
void Title::renderMarquee() {
|
void Title::renderMarquee() {
|
||||||
const auto TEXT = Resource::get()->getText("gauntlet");
|
// Solo renderizar letras activas (optimización: usa cache y rangos)
|
||||||
for (const auto& l : letters_) {
|
for (int i = first_active_letter_; i <= last_active_letter_ + 1 && i < (int)letters_.size(); ++i) {
|
||||||
if (l.enabled) {
|
const auto& letter = letters_[i];
|
||||||
TEXT->writeColored(l.x, 184, l.letter, static_cast<Uint8>(PaletteColor::BRIGHT_RED));
|
if (letter.enabled) {
|
||||||
|
marquee_text_->writeColored(
|
||||||
|
static_cast<int>(letter.x), // Conversión explícita float→int
|
||||||
|
static_cast<int>(MARQUEE_Y), // Usar constante
|
||||||
|
std::string(1, letter.letter), // Convertir char a string
|
||||||
|
static_cast<Uint8>(PaletteColor::BRIGHT_RED)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,13 +9,15 @@
|
|||||||
#include "utils/delta_timer.hpp" // Para DeltaTimer
|
#include "utils/delta_timer.hpp" // Para DeltaTimer
|
||||||
class SurfaceSprite; // Forward declaration
|
class SurfaceSprite; // Forward declaration
|
||||||
class Surface; // Forward declaration
|
class Surface; // Forward declaration
|
||||||
|
class Text; // Forward declaration
|
||||||
|
|
||||||
class Title {
|
class Title {
|
||||||
private:
|
private:
|
||||||
struct TitleLetter {
|
struct TitleLetter {
|
||||||
std::string letter; // Letra a escribir
|
char letter; // Letra a escribir (char es más eficiente que std::string)
|
||||||
float x; // Posición en el eje x (float para precisión con delta time)
|
float x; // Posición en el eje x (float para precisión con delta time)
|
||||||
bool enabled; // Solo se escriben y mueven si estan habilitadas
|
float width; // Ancho pre-calculado del carácter
|
||||||
|
bool enabled; // Solo se escriben y mueven si estan habilitadas
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class TitleState {
|
enum class TitleState {
|
||||||
@@ -25,11 +27,17 @@ class Title {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// --- Constantes de tiempo (en segundos) ---
|
// --- Constantes de tiempo (en segundos) ---
|
||||||
static constexpr float SHOW_LOADING_DURATION = 5.0f; // Tiempo mostrando loading screen (antes 500 frames)
|
static constexpr float SHOW_LOADING_DURATION = 5.0f; // Tiempo mostrando loading screen (antes 500 frames)
|
||||||
static constexpr float FADE_STEP_INTERVAL = 0.033f; // Intervalo entre pasos de fade (antes cada 4 frames)
|
static constexpr float FADE_STEP_INTERVAL = 0.033f; // Intervalo entre pasos de fade (antes cada 4 frames)
|
||||||
static constexpr float AUTO_CREDITS_TIMEOUT = 22.0f; // Timeout para ir a créditos (antes 2200 frames)
|
static constexpr float AUTO_CREDITS_TIMEOUT = 22.0f; // Timeout para ir a créditos (antes 2200 frames)
|
||||||
static constexpr float MARQUEE_SPEED = 100.0f; // Velocidad de marquesina (pixels/segundo)
|
static constexpr float MARQUEE_SPEED = 100.0f; // Velocidad de marquesina (pixels/segundo)
|
||||||
static constexpr float CHEEVOS_SCROLL_SPEED = 120.0f; // Velocidad de scroll de logros (pixels/segundo)
|
static constexpr float CHEEVOS_SCROLL_SPEED = 120.0f; // Velocidad de scroll de logros (pixels/segundo)
|
||||||
|
|
||||||
|
// --- Constantes de marquesina ---
|
||||||
|
static constexpr float MARQUEE_START_X = 256.0f; // Posición inicial (ancho pantalla)
|
||||||
|
static constexpr float MARQUEE_EXIT_X = -10.0f; // Cuando desaparece de pantalla
|
||||||
|
static constexpr float MARQUEE_Y = 184.0f; // Posición Y
|
||||||
|
static constexpr float MARQUEE_LETTER_SPACING = 1.0f; // Espaciado entre letras
|
||||||
|
|
||||||
// Objetos y punteros
|
// Objetos y punteros
|
||||||
std::shared_ptr<Surface> title_logo_surface_; // Textura con los graficos
|
std::shared_ptr<Surface> title_logo_surface_; // Textura con los graficos
|
||||||
@@ -41,15 +49,18 @@ class Title {
|
|||||||
std::shared_ptr<SurfaceSprite> cheevos_sprite_; // SSprite para manejar la surface con la lista de logros
|
std::shared_ptr<SurfaceSprite> cheevos_sprite_; // SSprite para manejar la surface con la lista de logros
|
||||||
|
|
||||||
// --- Variables de estado ---
|
// --- Variables de estado ---
|
||||||
std::unique_ptr<DeltaTimer> delta_timer_; // Timer para delta time
|
std::unique_ptr<DeltaTimer> delta_timer_; // Timer para delta time
|
||||||
std::string long_text_; // Texto que aparece en la parte inferior del titulo
|
std::shared_ptr<Text> marquee_text_; // Cache del texto para marquesina
|
||||||
std::vector<TitleLetter> letters_; // Vector con las letras de la marquesina
|
std::string long_text_; // Texto que aparece en la parte inferior del titulo
|
||||||
bool show_cheevos_ = false; // Indica si se muestra por pantalla el listado de logros
|
std::vector<TitleLetter> letters_; // Vector con las letras de la marquesina
|
||||||
SDL_FRect cheevos_surface_view_; // Zona visible de la surface con el listado de logros
|
int first_active_letter_; // Primera letra activa (optimización)
|
||||||
TitleState state_; // Estado en el que se encuentra el bucle principal
|
int last_active_letter_; // Última letra activa (optimización)
|
||||||
float state_time_; // Tiempo acumulado en el estado actual
|
bool show_cheevos_ = false; // Indica si se muestra por pantalla el listado de logros
|
||||||
float fade_accumulator_; // Acumulador para controlar el fade por tiempo
|
SDL_FRect cheevos_surface_view_; // Zona visible de la surface con el listado de logros
|
||||||
float current_delta_; // Delta time del frame actual
|
TitleState state_; // Estado en el que se encuentra el bucle principal
|
||||||
|
float state_time_; // Tiempo acumulado en el estado actual
|
||||||
|
float fade_accumulator_; // Acumulador para controlar el fade por tiempo
|
||||||
|
float current_delta_; // Delta time del frame actual
|
||||||
|
|
||||||
// --- Funciones ---
|
// --- Funciones ---
|
||||||
void update(); // Actualiza las variables
|
void update(); // Actualiza las variables
|
||||||
|
|||||||
Reference in New Issue
Block a user