use std::time::Duration;
use bevy::{app::ScheduleRunnerPlugin, prelude::*};
use bevy_cleanup::{AddStateCleanup, Cleanup};
fn main() {
App::new()
.add_plugins(MinimalPlugins.set(
ScheduleRunnerPlugin::run_loop(Duration::from_millis(500)),
))
.add_state::<AppState>()
.add_state_cleanup::<_, CleanupMenu>(AppState::Menu)
.add_state_cleanup::<_, CleanupGame>(AppState::Game)
.add_systems(
OnEnter(AppState::Menu),
(setup_menu, apply_deferred, print_all_entity_names).chain(),
)
.add_systems(
OnEnter(AppState::Game),
(setup_game, apply_deferred, print_all_entity_names).chain(),
)
.add_systems(
Update,
(
update_menu.run_if(in_state(AppState::Menu)),
damage_over_time.run_if(in_state(AppState::Game)),
),
)
.run()
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default, States)]
pub enum AppState {
#[default]
Menu,
Game,
}
#[derive(Debug, Component, Cleanup)]
pub struct CleanupMenu;
#[derive(Debug, Component, Cleanup)]
pub struct CleanupGame;
fn print_all_entity_names(query: Query<&Name>) {
println!("Entities in world:");
for name in &query {
println!(" - {}", name);
}
}
#[derive(Debug, Component)]
pub struct MenuUi;
fn setup_menu(mut commands: Commands) {
commands.spawn((
Name::new("Menu UI"),
CleanupMenu,
MenuUi,
));
println!("Set up menu - game will start in 1 second");
}
fn update_menu(time: Res<Time>, mut next_state: ResMut<NextState<AppState>>) {
if time.elapsed_seconds() > 1.0 {
next_state.set(AppState::Game);
}
}
#[derive(Debug, Component)]
pub struct Health(pub f32);
#[derive(Debug, Component)]
pub struct DamageOverTime(pub f32);
fn setup_game(mut commands: Commands) {
commands.spawn((
Name::new("Player"),
CleanupGame,
Health(1.0),
DamageOverTime(0.25),
));
println!("Set up game");
}
fn damage_over_time(
time: Res<Time>,
mut query: Query<(&mut Health, &DamageOverTime)>,
mut next_state: ResMut<NextState<AppState>>,
) {
for (mut health, dot) in &mut query {
health.0 -= dot.0 * time.delta_seconds();
println!("Player health is {}", health.0);
if health.0 <= 0.0 {
println!("Player died! Switching to main menu");
next_state.set(AppState::Menu);
}
}
}