Skip to content
Snippets Groups Projects
menu_state.rs 2.39 KiB
Newer Older
Louis's avatar
Louis committed
use std::time::Duration;

use bevy::prelude::*;
use bevy_tweening::lens::TextColorLens;
use bevy_tweening::{Animator, EaseFunction, RepeatCount, RepeatStrategy, Tween};
Louis's avatar
Louis committed
use iyes_loopless::state::NextState;
Louis's avatar
Louis committed
use micro_musicbox::prelude::{AudioEasing, AudioTween, MusicBox};
Louis's avatar
Louis committed

use crate::assets::AssetHandles;
Louis's avatar
Louis committed
use crate::system::flow::AppState;
Louis's avatar
Louis committed

#[derive(Component)]
pub struct MenuStateEntity;

Louis's avatar
Louis committed
pub fn spawn_menu_entities(
	mut commands: Commands,
	assets: Res<AssetHandles>,
	mut musicbox: MusicBox<AssetHandles>,
) {
Louis's avatar
Louis committed
	commands.spawn((
		SpriteBundle {
			texture: assets.image("menu_background"),
			transform: Transform::from_scale(Vec3::splat(0.85)),
Louis's avatar
Louis committed
			..Default::default()
		},
		MenuStateEntity,
	));

	commands
Louis's avatar
Louis committed
		.spawn((
			MenuStateEntity,
			NodeBundle {
				style: Style {
					size: Size::new(Val::Percent(100.0), Val::Percent(100.0)),
					flex_direction: FlexDirection::Column,
					align_items: AlignItems::Center,
					..Default::default()
				},
Louis's avatar
Louis committed
				..Default::default()
			},
Louis's avatar
Louis committed
		))
Louis's avatar
Louis committed
		.with_children(|commands| {
			commands.spawn(TextBundle {
				text: Text::from_section(
					"Trader Tales",
					TextStyle {
						font_size: 72.0,
						font: assets.font("compass_pro"),
Louis's avatar
Louis committed
						color: Color::ANTIQUE_WHITE,
					},
				),
				style: Style {
					margin: UiRect::top(Val::Percent(20.0)),
					..Default::default()
				},
				..Default::default()
			});
			commands.spawn((
				TextBundle {
					text: Text::from_section(
Louis's avatar
Louis committed
						"> Press Space <",
Louis's avatar
Louis committed
						TextStyle {
							font_size: 48.0,
							font: assets.font("compass_pro"),
Louis's avatar
Louis committed
							color: Color::ANTIQUE_WHITE,
						},
					),
					style: Style {
						margin: UiRect::top(Val::Px(50.0)),
						..Default::default()
					},
					..Default::default()
				},
				Animator::new(
					Tween::new(
						EaseFunction::QuadraticInOut,
						Duration::from_secs(1),
						TextColorLens {
							start: Color::ANTIQUE_WHITE,
							end: *Color::ANTIQUE_WHITE.set_a(0.0),
							section: 0,
						},
					)
					.with_repeat_count(RepeatCount::Infinite)
					.with_repeat_strategy(RepeatStrategy::MirroredRepeat),
				),
			));
		});
}

Louis's avatar
Louis committed
pub fn go_to_game(input: Res<Input<KeyCode>>, mut commands: Commands) {
	if input.just_released(KeyCode::Space) {
		commands.insert_resource(NextState(AppState::InGame));
	}
}

Louis's avatar
Louis committed
pub fn despawn_menu_entities(mut commands: Commands, query: Query<Entity, With<MenuStateEntity>>) {
	for entity in &query {
		commands.entity(entity).despawn_recursive();
	}
}