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())),
|
||||
bg_surface_(std::make_shared<Surface>(Options::game.width, Options::game.height)),
|
||||
delta_timer_(std::make_unique<DeltaTimer>()),
|
||||
marquee_text_(Resource::get()->getText("gauntlet")),
|
||||
first_active_letter_(0),
|
||||
last_active_letter_(0),
|
||||
state_time_(0.0f),
|
||||
fade_accumulator_(0.0f),
|
||||
current_delta_(0.0f) {
|
||||
@@ -52,14 +55,20 @@ Title::Title()
|
||||
void Title::initMarquee() {
|
||||
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?";
|
||||
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;
|
||||
l.letter = long_text_.substr(i, 1);
|
||||
l.x = 256.0f;
|
||||
l.letter = long_text_[i]; // char directo, no substring
|
||||
l.x = MARQUEE_START_X; // Usar constante
|
||||
l.width = marquee_text_->lenght(std::string(1, long_text_[i])); // Pre-calcular ancho
|
||||
l.enabled = false;
|
||||
letters_.push_back(l);
|
||||
}
|
||||
|
||||
letters_[0].enabled = true;
|
||||
first_active_letter_ = 0;
|
||||
last_active_letter_ = 0;
|
||||
}
|
||||
|
||||
// Comprueba el manejador de eventos
|
||||
@@ -112,36 +121,48 @@ void Title::checkInput() {
|
||||
|
||||
// Actualiza la marquesina
|
||||
void Title::updateMarquee(float delta_time) {
|
||||
const auto TEXT = Resource::get()->getText("gauntlet");
|
||||
const float displacement = MARQUEE_SPEED * delta_time;
|
||||
|
||||
for (int i = 0; i < (int)letters_.size(); ++i) {
|
||||
if (letters_[i].enabled) {
|
||||
letters_[i].x -= displacement;
|
||||
if (letters_[i].x < -10.0f) {
|
||||
letters_[i].enabled = false;
|
||||
}
|
||||
} else {
|
||||
if (i > 0 && letters_[i - 1].x < 256.0f && letters_[i - 1].enabled) {
|
||||
letters_[i].enabled = true;
|
||||
letters_[i].x = letters_[i - 1].x + TEXT->lenght(letters_[i - 1].letter) + 1.0f;
|
||||
// Solo procesar letras en rango activo + 1 para poder activar la siguiente
|
||||
for (int i = first_active_letter_; i <= last_active_letter_ + 1 && i < (int)letters_.size(); ++i) {
|
||||
auto& letter = letters_[i];
|
||||
|
||||
if (letter.enabled) {
|
||||
letter.x -= displacement;
|
||||
|
||||
// Desactivar si sale de pantalla
|
||||
if (letter.x < MARQUEE_EXIT_X) {
|
||||
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
|
||||
if (letters_[letters_.size() - 1].x < -10.0f) {
|
||||
// Inicializa la marquesina
|
||||
if (letters_[letters_.size() - 1].x < MARQUEE_EXIT_X) {
|
||||
initMarquee();
|
||||
}
|
||||
}
|
||||
|
||||
// Dibuja la marquesina
|
||||
void Title::renderMarquee() {
|
||||
const auto TEXT = Resource::get()->getText("gauntlet");
|
||||
for (const auto& l : letters_) {
|
||||
if (l.enabled) {
|
||||
TEXT->writeColored(l.x, 184, l.letter, static_cast<Uint8>(PaletteColor::BRIGHT_RED));
|
||||
// Solo renderizar letras activas (optimización: usa cache y rangos)
|
||||
for (int i = first_active_letter_; i <= last_active_letter_ + 1 && i < (int)letters_.size(); ++i) {
|
||||
const auto& letter = letters_[i];
|
||||
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)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user