refactor(floor): separate systems

This commit is contained in:
Kristofers Solo 2024-12-23 14:55:27 +02:00
parent 3659ffa1a6
commit 433a3ce5e8
2 changed files with 31 additions and 22 deletions

View File

@ -5,13 +5,18 @@ mod spawn;
use crate::maze::MazePluginLoaded;
use bevy::prelude::*;
use despawn::despawn_floor;
use movement::floor_movement;
use movement::{handle_floor_transition_events, move_floors};
use spawn::spawn_floor;
pub(super) fn plugin(app: &mut App) {
app.add_systems(
Update,
(spawn_floor, despawn_floor, floor_movement)
(
spawn_floor,
despawn_floor,
handle_floor_transition_events,
move_floors,
)
.chain()
.run_if(resource_exists::<MazePluginLoaded>),
);

View File

@ -3,21 +3,40 @@ use crate::{
components::{CurrentFloor, MovementState, NextFloor},
events::TransitionFloor,
},
maze::{components::Maze, GlobalMazeConfig},
maze::components::Maze,
player::components::{MovementSpeed, Player},
};
use bevy::prelude::*;
const MOVEMENT_THRESHOLD: f32 = 0.001;
pub(super) fn floor_movement(
pub(super) fn move_floors(
mut commands: Commands,
mut maze_query: Query<(Entity, &mut Transform, Option<&mut MovementState>), With<Maze>>,
player_query: Query<&MovementSpeed, With<Player>>,
time: Res<Time>,
) {
let speed = player_query.get_single().map_or(100., |s| s.0);
let movement_distance = speed * time.delta_secs();
for (entity, mut transform, mut movement_state) in maze_query.iter_mut() {
if let Some(state) = movement_state.as_mut() {
let delta = state.target_y - transform.translation.y;
if delta.abs() > MOVEMENT_THRESHOLD {
let movement = delta.signum() * movement_distance.min(delta.abs());
transform.translation.y += movement;
} else {
transform.translation.y = state.target_y;
commands.entity(entity).remove::<MovementState>();
}
}
}
}
pub(super) fn handle_floor_transition_events(
mut commands: Commands,
mut maze_query: Query<(Entity, &mut Transform, Option<&mut MovementState>), With<Maze>>,
current_query: Query<Entity, With<CurrentFloor>>,
next_query: Query<Entity, With<NextFloor>>,
player_query: Query<&MovementSpeed, With<Player>>,
time: Res<Time>,
_global_config: Res<GlobalMazeConfig>,
mut event_reader: EventReader<TransitionFloor>,
) {
for event in event_reader.read() {
@ -46,21 +65,6 @@ pub(super) fn floor_movement(
update_current_next_floor(&mut commands, current_entity, next_entity);
}
let speed = player_query.get_single().map_or(100., |s| s.0);
let movement_distance = speed * time.delta_secs();
for (entity, mut transform, mut movement_state) in maze_query.iter_mut() {
if let Some(state) = movement_state.as_mut() {
let delta = state.target_y - transform.translation.y;
if delta.abs() > MOVEMENT_THRESHOLD {
let movement = delta.signum() * movement_distance.min(delta.abs());
transform.translation.y += movement;
} else {
transform.translation.y = state.target_y;
commands.entity(entity).remove::<MovementState>();
}
}
}
}
fn update_current_next_floor(commands: &mut Commands, current_entity: Entity, next_entity: Entity) {