Added an extra starting state so the player doesn't start moving instantly
parent
a198326f25
commit
6e92bf9364
14
src/hud.rs
14
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<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);
|
||||
}
|
||||
|
|
23
src/level.rs
23
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<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>,
|
||||
|
|
|
@ -24,6 +24,7 @@ pub const START_POSITION: Vec3 =
|
|||
pub enum GameState {
|
||||
#[default]
|
||||
Menu,
|
||||
Starting,
|
||||
Playing,
|
||||
GameOver,
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue