From 6e92bf93645d56cd1a3435c5741ea078472e9705 Mon Sep 17 00:00:00 2001 From: Wynd Date: Thu, 10 Apr 2025 23:30:52 +0300 Subject: [PATCH] Added an extra starting state so the player doesn't start moving instantly --- src/hud.rs | 14 ++++++++++---- src/level.rs | 23 ++++++++++++++++++++++- src/lib.rs | 1 + 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/hud.rs b/src/hud.rs index ca80e0d..8d21244 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -1,6 +1,6 @@ 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; @@ -122,7 +122,7 @@ fn start_button_logic( mut score: ResMut, gamepads: Query<&Gamepad>, mut button: Query<(&Interaction, &mut BorderColor), With>, - mut player_query: Query<(&mut Transform, &mut Visibility), With>, + mut player_query: Query<(&mut Transform, &mut Visibility, &mut Velocity), With>, mut ui_elems_query: Query<&mut Visibility, (With, Without)>, mut score_text_query: Query<&mut Text, With>, ) { @@ -131,7 +131,8 @@ fn start_button_logic( }; 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(); @@ -144,6 +145,7 @@ fn start_button_logic( &mut ui_elems_query, &mut player_visibility, &mut player_transform, + &mut player_velocity, ); return; } @@ -160,6 +162,7 @@ fn start_button_logic( &mut ui_elems_query, &mut player_visibility, &mut player_transform, + &mut player_velocity, ); } Interaction::Hovered => border_color.0 = Color::WHITE, @@ -174,11 +177,12 @@ fn start_game( ui_elems: &mut Query<&mut Visibility, (With, Without)>, player_visibility: &mut Visibility, player_transform: &mut Transform, + player_velocity: &mut Velocity, ) { score.0 = 0; score_text.0 = format!("{}", score.0); - state.set(GameState::Playing); + state.set(GameState::Starting); for mut elem in ui_elems { *elem = Visibility::Hidden; @@ -186,4 +190,6 @@ fn start_game( *player_visibility = Visibility::Visible; player_transform.translation = START_POSITION; + player_transform.rotation = Quat::from_rotation_x(0.0); + *player_velocity = Velocity(Vec2::ZERO); } diff --git a/src/level.rs b/src/level.rs index d4d93cf..71958c6 100644 --- a/src/level.rs +++ b/src/level.rs @@ -1,4 +1,4 @@ -use std::f32::consts::PI; +use std::{f32::consts::PI, time::Duration}; use bevy::{ math::bounding::{Aabb2d, BoundingCircle, IntersectsVolume}, @@ -31,8 +31,13 @@ impl Plugin for LevelPlugin { app.add_plugins(AnimationPlugin); app.add_plugins(PathFollow2DPlugin); 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(Update, (debug_gizmos, debug_gizmos_config)); + app.add_systems( + FixedUpdate, + (start_countdown).run_if(in_state(GameState::Starting)), + ); app.add_systems( FixedUpdate, (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)] struct SpawnTimer(Timer); +#[derive(Resource, Deref, DerefMut)] +struct StartTimer(Timer); + #[derive(Component, Default)] #[require(Sprite, Velocity, Collider)] pub struct Unit; @@ -66,6 +74,19 @@ pub struct Collider; #[derive(Event, Default)] pub struct CollisionEvent; +fn start_countdown( + time: Res