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 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);
|
||||||
}
|
}
|
||||||
|
|
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::{
|
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>,
|
||||||
|
|
|
@ -24,6 +24,7 @@ pub const START_POSITION: Vec3 =
|
||||||
pub enum GameState {
|
pub enum GameState {
|
||||||
#[default]
|
#[default]
|
||||||
Menu,
|
Menu,
|
||||||
|
Starting,
|
||||||
Playing,
|
Playing,
|
||||||
GameOver,
|
GameOver,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue