#include "game/scenes/menu_scene.hpp" #include #include "core/jail/jdraw8.hpp" #include "core/jail/jinput.hpp" #include "game/info.hpp" namespace Scenes { void MenuScene::onEnter() { fondo_ = SurfaceHandle("gfx/menu.gif"); gfx_ = SurfaceHandle("gfx/menu2.gif"); // Pintat inicial (congelat durant el fade-in de paleta). El loop // d'animació repintarà tot des de zero en el primer tick de SHOWING. Jd8::blit(fondo_); Jd8::blitCK(100, 25, gfx_, 0, 74, 124, 68, 255); // logo Jd8::blitCK(130, 100, gfx_, 0, 0, 80, 74, 255); // camell (frame 0) Jd8::blitCK(0, 150, gfx_, 0, 150, 320, 50, 255); // base "jdes" Jd8::Palette pal = Jd8::loadPalette("gfx/menu2.gif"); fade_.startFadeTo(pal); delete[] pal; phase_ = Phase::FADING_IN; } void MenuScene::render() { // Cel estàtic (els primers 100 pixels verticals) Jd8::blit(0, 0, fondo_, 0, 0, 320, 100); // Fondo mòvil (horitzó) amb wrap a 320 Jd8::blitCK(horitzo_, 100, fondo_, 0, 100, 320 - horitzo_, 100, 255); Jd8::blitCK(0, 100, fondo_, 320 - horitzo_, 100, horitzo_, 100, 255); // Logo i camell animat Jd8::blitCK(100, 25, gfx_, 0, 74, 124, 68, 255); Jd8::blitCK(130, 100, gfx_, camello_.frame() * 80, 0, 80, 74, 255); // Palmeres mòvils amb wrap a 320 Jd8::blitCK(palmeres_, 150, gfx_, 0, 150, 320 - palmeres_, 50, 255); Jd8::blitCK(0, 150, gfx_, 320 - palmeres_, 150, palmeres_, 50, 255); // "jdes" estàtic (davant dels scrollers) i versió a la cantonada Jd8::blitCK(87, 167, gfx_, 127, 124, 150, 24, 255); Jd8::blitCK(303, 193, gfx_, 305, 143, 15, 5, 255); // "Polsa tecla" parpallejant. Al vell `contador % 100 > 30` amb // updateTicks=20 ms, el cicle són 2000 ms amb un llindar de 600 ms: // amagat els primers 600 ms, visible els següents 1400 ms. const bool BLINK_ON = (blink_ms_ % 2000) > 600; if (BLINK_ON) { Jd8::blitCK(98, 130, gfx_, 161, 92, 127, 9, 255); if (Info::ctx.nou_personatge) { Jd8::blitCK(68, 141, gfx_, 128, 105, 189, 9, 255); } } } void MenuScene::tick(int delta_ms) { switch (phase_) { case Phase::FADING_IN: fade_.tick(delta_ms); if (fade_.done()) { phase_ = Phase::SHOWING; } break; case Phase::SHOWING: { // Palmeres: 1 pixel cada 80 ms (= cada 4 ticks × 20 ms originals) palmeres_acc_ms_ += delta_ms; while (palmeres_acc_ms_ >= 80) { palmeres_acc_ms_ -= 80; if (--palmeres_ < 0) { palmeres_ = 319; } } // Horitzó: 1 pixel cada 320 ms (= cada 16 ticks × 20 ms) horitzo_acc_ms_ += delta_ms; while (horitzo_acc_ms_ >= 320) { horitzo_acc_ms_ -= 320; if (--horitzo_ < 0) { horitzo_ = 319; } } camello_.tick(delta_ms); blink_ms_ += delta_ms; if (blink_ms_ >= 2000) { blink_ms_ %= 2000; } render(); // Qualsevol tecla tanca el menú. Llegim 'P' explícitament abans // de reiniciar el flag de input perquè `Info::ctx.pepe_activat` // reflecteixca si l'usuari estava polsant P al moment d'eixir. if (Ji::anyKey() || Ji::keyPressed(SDL_SCANCODE_P)) { Info::ctx.pepe_activat = Ji::keyPressed(SDL_SCANCODE_P); Ji::disableKeyboard(60); Info::ctx.num_piramide = 1; fade_.startFadeOut(); phase_ = Phase::FADING_OUT; } break; } case Phase::FADING_OUT: fade_.tick(delta_ms); if (fade_.done()) { phase_ = Phase::DONE; } break; case Phase::DONE: break; } } } // namespace Scenes