added minimal animation for splash screen
This commit is contained in:
parent
43f481d864
commit
4e278b29bd
@ -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),
|
||||
|
||||
@ -3,7 +3,7 @@ use crate::model::Cartridge;
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum FirmwareState {
|
||||
Reset,
|
||||
SplashScreen,
|
||||
SplashScreen(u32),
|
||||
LaunchHub,
|
||||
HubHome,
|
||||
LoadApp(Cartridge),
|
||||
|
||||
@ -4,5 +4,5 @@ use crate::prometeu_os::PrometeuOS;
|
||||
pub fn step_reset(os: &mut PrometeuOS) -> Option<FirmwareState> {
|
||||
os.reset();
|
||||
|
||||
Some(FirmwareState::SplashScreen)
|
||||
Some(FirmwareState::SplashScreen(0))
|
||||
}
|
||||
@ -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<FirmwareState> {
|
||||
pub fn step_splash_screen(frame: &mut u32, os: &mut PrometeuOS, signals: &InputSignals, hw: &mut dyn HardwareBridge) -> Option<FirmwareState> {
|
||||
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
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user