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 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<Score>,
gamepads: Query<&Gamepad>,
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 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 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<StartMenuUI>, Without<Player>)>,
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);
}

View File

@ -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<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(
mut commands: Commands,
asset_server: Res<AssetServer>,

View File

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