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) {
|
pub fn step_frame(&mut self, signals: &InputSignals, hw: &mut dyn HardwareBridge) {
|
||||||
|
let os = &mut self.os;
|
||||||
let next_state = match &mut self.state {
|
let next_state = match &mut self.state {
|
||||||
FirmwareState::Reset => firmware_step_reset::step_reset(&mut self.os),
|
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::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::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),
|
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)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum FirmwareState {
|
pub enum FirmwareState {
|
||||||
Reset,
|
Reset,
|
||||||
SplashScreen,
|
SplashScreen(u32),
|
||||||
LaunchHub,
|
LaunchHub,
|
||||||
HubHome,
|
HubHome,
|
||||||
LoadApp(Cartridge),
|
LoadApp(Cartridge),
|
||||||
|
|||||||
@ -4,5 +4,5 @@ use crate::prometeu_os::PrometeuOS;
|
|||||||
pub fn step_reset(os: &mut PrometeuOS) -> Option<FirmwareState> {
|
pub fn step_reset(os: &mut PrometeuOS) -> Option<FirmwareState> {
|
||||||
os.reset();
|
os.reset();
|
||||||
|
|
||||||
Some(FirmwareState::SplashScreen)
|
Some(FirmwareState::SplashScreen(0))
|
||||||
}
|
}
|
||||||
@ -1,7 +1,51 @@
|
|||||||
use crate::firmware::firmware_state::FirmwareState;
|
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.start.begin_frame(signals.start_signal);
|
||||||
self.select.begin_frame(signals.select_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