From 28ec0413813d8475c0b07afb6419072cce98d681 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Fri, 16 Jan 2026 16:07:12 +0000 Subject: [PATCH] added minimal animation for splash screen --- crates/prometeu-core/src/firmware/firmware.rs | 5 +- .../src/firmware/firmware_state.rs | 2 +- .../src/firmware/firmware_step_reset.rs | 2 +- .../firmware/firmware_step_splash_screen.rs | 48 ++++++++++++++++++- crates/prometeu-core/src/hardware/pad.rs | 11 +++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/crates/prometeu-core/src/firmware/firmware.rs b/crates/prometeu-core/src/firmware/firmware.rs index b6b8e597..f6483b47 100644 --- a/crates/prometeu-core/src/firmware/firmware.rs +++ b/crates/prometeu-core/src/firmware/firmware.rs @@ -21,9 +21,12 @@ impl Firmware { } pub fn step_frame(&mut self, signals: &InputSignals, hw: &mut dyn HardwareBridge) { + let os = &mut self.os; let next_state = match &mut self.state { FirmwareState::Reset => firmware_step_reset::step_reset(&mut self.os), - FirmwareState::SplashScreen => firmware_step_splash_screen::step_splash_screen(), + FirmwareState::SplashScreen(frame) => { + firmware_step_splash_screen::step_splash_screen(frame, os, signals, hw) + }, FirmwareState::LaunchHub => firmware_step_launch_hub::launch_hub(&mut self.os, &mut self.hub), FirmwareState::HubHome => firmware_step_hub_home::step_hub_home(&mut self.hub, &mut self.os, hw), FirmwareState::LoadApp(cartridge) => firmware_step_init_app::step_init_app(&mut self.os, signals, hw, cartridge), diff --git a/crates/prometeu-core/src/firmware/firmware_state.rs b/crates/prometeu-core/src/firmware/firmware_state.rs index 9e001c15..91c1028a 100644 --- a/crates/prometeu-core/src/firmware/firmware_state.rs +++ b/crates/prometeu-core/src/firmware/firmware_state.rs @@ -3,7 +3,7 @@ use crate::model::Cartridge; #[derive(Debug, Clone)] pub enum FirmwareState { Reset, - SplashScreen, + SplashScreen(u32), LaunchHub, HubHome, LoadApp(Cartridge), diff --git a/crates/prometeu-core/src/firmware/firmware_step_reset.rs b/crates/prometeu-core/src/firmware/firmware_step_reset.rs index 97acc05e..4f19948f 100644 --- a/crates/prometeu-core/src/firmware/firmware_step_reset.rs +++ b/crates/prometeu-core/src/firmware/firmware_step_reset.rs @@ -4,5 +4,5 @@ use crate::prometeu_os::PrometeuOS; pub fn step_reset(os: &mut PrometeuOS) -> Option { os.reset(); - Some(FirmwareState::SplashScreen) + Some(FirmwareState::SplashScreen(0)) } \ No newline at end of file diff --git a/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs b/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs index 41f09ded..df1d8c13 100644 --- a/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs +++ b/crates/prometeu-core/src/firmware/firmware_step_splash_screen.rs @@ -1,7 +1,51 @@ use crate::firmware::firmware_state::FirmwareState; +use crate::hardware::{HardwareBridge, InputSignals, LoopMode}; +use crate::model::Color; +use crate::prometeu_os::PrometeuOS; -pub fn step_splash_screen() -> Option { +pub fn step_splash_screen(frame: &mut u32, os: &mut PrometeuOS, signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option { + const ANIMATION_DURATION: u32 = 60; // 1 segundo a 60fps + const TOTAL_DURATION: u32 = 240; // 4 segundos totais + // Atualiza periféricos para input + hw.pad_mut().begin_frame(signals); - Some(FirmwareState::LaunchHub) + // Tocar som no primeiro frame + if *frame == 0 { + if let Some(sample) = os.sample_square.clone() { + hw.audio_mut().play(sample, 0, 255, 127, 1.0, 0, LoopMode::Off); + } + } + + // Limpar tela + hw.gfx_mut().clear(Color::BLACK); + + // Desenhar quadrado aumentando + let (sw, sh) = hw.gfx().size(); + let max_size = (sw.min(sh) as i32 / 2).max(1); + + let current_size = if *frame < ANIMATION_DURATION { + (max_size * (*frame as i32 + 1)) / ANIMATION_DURATION as i32 + } else { + max_size + }; + + let x = (sw as i32 - current_size) / 2; + let y = (sh as i32 - current_size) / 2; + + hw.gfx_mut().fill_rect(x, y, current_size, current_size, Color::WHITE); + hw.gfx_mut().present(); + + // Lógica de transição + // Caso o botão start seja pressionado a qualquer momento depois da animação terminar + if *frame >= ANIMATION_DURATION && hw.pad().any() { + return Some(FirmwareState::LaunchHub); + } + + if *frame >= TOTAL_DURATION { + return Some(FirmwareState::LaunchHub); + } + + *frame += 1; + None } \ No newline at end of file diff --git a/crates/prometeu-core/src/hardware/pad.rs b/crates/prometeu-core/src/hardware/pad.rs index 473e55fd..45db571d 100644 --- a/crates/prometeu-core/src/hardware/pad.rs +++ b/crates/prometeu-core/src/hardware/pad.rs @@ -36,6 +36,17 @@ impl Pad { self.start.begin_frame(signals.start_signal); self.select.begin_frame(signals.select_signal); } + + pub fn any(&self) -> bool { + self.a.down + || self.b.down + || self.x.down + || self.y.down + || self.l.down + || self.r.down + || self.start.down + || self.select.down + } }