Added an extra starting state so the player doesn't start moving instantly

master
Wynd 2025-04-10 23:30:52 +03:00
parent a198326f25
commit 6e92bf9364
3 changed files with 33 additions and 5 deletions

View File

@ -1,6 +1,6 @@
use bevy::{asset::AssetPath, prelude::*}; use bevy::{asset::AssetPath, prelude::*};
use crate::{player::Player, score::Score, GameState, START_POSITION}; use crate::{common::velocity::Velocity, player::Player, score::Score, GameState, START_POSITION};
pub struct HUDPlugin; pub struct HUDPlugin;
@ -122,7 +122,7 @@ fn start_button_logic(
mut score: ResMut<Score>, mut score: ResMut<Score>,
gamepads: Query<&Gamepad>, gamepads: Query<&Gamepad>,
mut button: Query<(&Interaction, &mut BorderColor), With<StartButton>>, mut button: Query<(&Interaction, &mut BorderColor), With<StartButton>>,
mut player_query: Query<(&mut Transform, &mut Visibility), With<Player>>, mut player_query: Query<(&mut Transform, &mut Visibility, &mut Velocity), With<Player>>,
mut ui_elems_query: Query<&mut Visibility, (With<StartMenuUI>, Without<Player>)>, mut ui_elems_query: Query<&mut Visibility, (With<StartMenuUI>, Without<Player>)>,
mut score_text_query: Query<&mut Text, With<ScoreText>>, mut score_text_query: Query<&mut Text, With<ScoreText>>,
) { ) {
@ -131,7 +131,8 @@ fn start_button_logic(
}; };
let mut score_text = score_text_query.single_mut(); let mut score_text = score_text_query.single_mut();
let (mut player_transform, mut player_visibility) = player_query.single_mut(); let (mut player_transform, mut player_visibility, mut player_velocity) =
player_query.single_mut();
let gamepad = gamepads.get_single(); let gamepad = gamepads.get_single();
@ -144,6 +145,7 @@ fn start_button_logic(
&mut ui_elems_query, &mut ui_elems_query,
&mut player_visibility, &mut player_visibility,
&mut player_transform, &mut player_transform,
&mut player_velocity,
); );
return; return;
} }
@ -160,6 +162,7 @@ fn start_button_logic(
&mut ui_elems_query, &mut ui_elems_query,
&mut player_visibility, &mut player_visibility,
&mut player_transform, &mut player_transform,
&mut player_velocity,
); );
} }
Interaction::Hovered => border_color.0 = Color::WHITE, Interaction::Hovered => border_color.0 = Color::WHITE,
@ -174,11 +177,12 @@ fn start_game(
ui_elems: &mut Query<&mut Visibility, (With<StartMenuUI>, Without<Player>)>, ui_elems: &mut Query<&mut Visibility, (With<StartMenuUI>, Without<Player>)>,
player_visibility: &mut Visibility, player_visibility: &mut Visibility,
player_transform: &mut Transform, player_transform: &mut Transform,
player_velocity: &mut Velocity,
) { ) {
score.0 = 0; score.0 = 0;
score_text.0 = format!("{}", score.0); score_text.0 = format!("{}", score.0);
state.set(GameState::Playing); state.set(GameState::Starting);
for mut elem in ui_elems { for mut elem in ui_elems {
*elem = Visibility::Hidden; *elem = Visibility::Hidden;
@ -186,4 +190,6 @@ fn start_game(
*player_visibility = Visibility::Visible; *player_visibility = Visibility::Visible;
player_transform.translation = START_POSITION; player_transform.translation = START_POSITION;
player_transform.rotation = Quat::from_rotation_x(0.0);
*player_velocity = Velocity(Vec2::ZERO);
} }

View File

@ -1,4 +1,4 @@
use std::f32::consts::PI; use std::{f32::consts::PI, time::Duration};
use bevy::{ use bevy::{
math::bounding::{Aabb2d, BoundingCircle, IntersectsVolume}, math::bounding::{Aabb2d, BoundingCircle, IntersectsVolume},
@ -31,8 +31,13 @@ impl Plugin for LevelPlugin {
app.add_plugins(AnimationPlugin); app.add_plugins(AnimationPlugin);
app.add_plugins(PathFollow2DPlugin); app.add_plugins(PathFollow2DPlugin);
app.insert_resource(SpawnTimer(Timer::from_seconds(0.5, TimerMode::Repeating))); app.insert_resource(SpawnTimer(Timer::from_seconds(0.5, TimerMode::Repeating)));
app.insert_resource(StartTimer(Timer::from_seconds(0.5, TimerMode::Once)));
app.add_systems(Startup, setup); app.add_systems(Startup, setup);
app.add_systems(Update, (debug_gizmos, debug_gizmos_config)); app.add_systems(Update, (debug_gizmos, debug_gizmos_config));
app.add_systems(
FixedUpdate,
(start_countdown).run_if(in_state(GameState::Starting)),
);
app.add_systems( app.add_systems(
FixedUpdate, FixedUpdate,
(spawn_enemy, check_for_collisions, game_over).run_if(in_state(GameState::Playing)), (spawn_enemy, check_for_collisions, game_over).run_if(in_state(GameState::Playing)),
@ -56,6 +61,9 @@ fn setup(mut commands: Commands) {
#[derive(Resource, Deref, DerefMut)] #[derive(Resource, Deref, DerefMut)]
struct SpawnTimer(Timer); struct SpawnTimer(Timer);
#[derive(Resource, Deref, DerefMut)]
struct StartTimer(Timer);
#[derive(Component, Default)] #[derive(Component, Default)]
#[require(Sprite, Velocity, Collider)] #[require(Sprite, Velocity, Collider)]
pub struct Unit; pub struct Unit;
@ -66,6 +74,19 @@ pub struct Collider;
#[derive(Event, Default)] #[derive(Event, Default)]
pub struct CollisionEvent; pub struct CollisionEvent;
fn start_countdown(
time: Res<Time>,
mut timer: ResMut<StartTimer>,
mut state: ResMut<NextState<GameState>>,
) {
timer.tick(time.delta());
if timer.finished() {
state.set(GameState::Playing);
timer.reset();
}
}
fn spawn_enemy( fn spawn_enemy(
mut commands: Commands, mut commands: Commands,
asset_server: Res<AssetServer>, asset_server: Res<AssetServer>,

View File

@ -24,6 +24,7 @@ pub const START_POSITION: Vec3 =
pub enum GameState { pub enum GameState {
#[default] #[default]
Menu, Menu,
Starting,
Playing, Playing,
GameOver, GameOver,
} }