|
use bevy::{ |
|
app::App, |
|
color::Color, |
|
log::info, |
|
math::Vec2, |
|
prelude::{ OnEnter, States }, |
|
reflect::Reflect, |
|
render::camera::ScalingMode, |
|
state::app::AppExtStates as _, |
|
}; |
|
use bevy_asset_loader::{ |
|
loading_state::{ LoadingState, LoadingStateAppExt }, |
|
standard_dynamic_asset::StandardDynamicAsset, |
|
}; |
|
use iyes_progress::ProgressPlugin; |
|
|
|
use crate::plugins::splashscreen::{ SplashScreenConfiguration, SplashScreenPlugin }; |
|
|
|
#[derive(States, Default, Debug, Clone, Eq, PartialEq, Hash, Reflect)] |
|
pub enum GameState { |
|
#[default] |
|
SplashScreen, |
|
Playing, |
|
|
|
Loading, |
|
MainMenu, |
|
} |
|
|
|
pub fn set_state_splashscreen() { |
|
info!("Set GameState: SplashScreen"); |
|
} |
|
|
|
pub fn set_state_loading() { |
|
info!("Set GameState: Loading"); |
|
} |
|
|
|
pub fn set_state_mainmenu() { |
|
info!("Set GameState: MainMenu"); |
|
} |
|
|
|
pub fn set_state_playing() { |
|
info!("Set GameState: Playing"); |
|
} |
|
|
|
pub fn game_state_plugin(app: &mut App) { |
|
let splash_timer = if cfg!(debug_assertions) { 0.5 } else { 3.0 }; |
|
|
|
let config = SplashScreenConfiguration { |
|
run_state: GameState::SplashScreen, |
|
next_state: GameState::Playing, |
|
|
|
|
|
images: StandardDynamicAsset::Files { |
|
paths: vec!["splash_screens/splash.png".to_owned()], |
|
}, |
|
custom_size: Some(Vec2::ONE), |
|
splash_timer, |
|
clear_color: Color::BLACK, |
|
camera_scaling_mode: ScalingMode::Fixed { |
|
width: 1.0, |
|
height: 1.0, |
|
}, |
|
}; |
|
|
|
|
|
app.init_state::<GameState>() |
|
.register_type::<GameState>() |
|
.add_loading_state(LoadingState::new(GameState::SplashScreen)) |
|
.add_systems(OnEnter(GameState::SplashScreen), set_state_splashscreen) |
|
.add_systems(OnEnter(GameState::Loading), set_state_loading) |
|
.add_systems(OnEnter(GameState::MainMenu), set_state_mainmenu) |
|
.add_systems(OnEnter(GameState::Playing), set_state_playing) |
|
|
|
.add_plugins(SplashScreenPlugin(config)) |
|
.add_plugins(ProgressPlugin::new(GameState::SplashScreen).continue_to(GameState::Playing)); |
|
} |
|
|