//! A credits screen that can be accessed from the title screen. use bevy::prelude::*; use crate::{asset_tracking::LoadResource, audio::Music, screens::Screen, theme::prelude::*}; pub(super) fn plugin(app: &mut App) { app.add_systems(OnEnter(Screen::Credits), spawn_credits_screen); app.load_resource::(); app.add_systems(OnEnter(Screen::Credits), play_credits_music); app.add_systems(OnExit(Screen::Credits), stop_music); } fn spawn_credits_screen(mut commands: Commands) { commands .ui_root() .insert(StateScoped(Screen::Credits)) .with_children(|children| { children.header("Made by"); children.label("Joe Shmoe - Implemented aligator wrestling AI"); children.label("Jane Doe - Made the music for the alien invasion"); children.header("Assets"); children.label("Bevy logo - All rights reserved by the Bevy Foundation. Permission granted for splash screen use when unmodified."); children.label("Ducky sprite - CC0 by Caz Creates Games"); children.label("Button SFX - CC0 by Jaszunio15"); children.label("Music - CC BY 3.0 by Kevin MacLeod"); children.button("Back").observe(enter_title_screen); }); } fn enter_title_screen(_trigger: Trigger, mut next_screen: ResMut>) { next_screen.set(Screen::Title); } #[derive(Resource, Asset, Reflect, Clone)] pub struct CreditsMusic { #[dependency] music: Handle, entity: Option, } impl FromWorld for CreditsMusic { fn from_world(world: &mut World) -> Self { let assets = world.resource::(); Self { music: assets.load("audio/music/Monkeys Spinning Monkeys.ogg"), entity: None, } } } fn play_credits_music(mut commands: Commands, mut music: ResMut) { music.entity = Some( commands .spawn(( AudioBundle { source: music.music.clone(), settings: PlaybackSettings::LOOP, }, Music, )) .id(), ); } fn stop_music(mut commands: Commands, mut music: ResMut) { if let Some(entity) = music.entity.take() { commands.entity(entity).despawn_recursive(); } }