From 5cc9b1a6ee8a5b5532ee96f4c4fee39944f753e9 Mon Sep 17 00:00:00 2001 From: Ryan Walters Date: Thu, 28 Aug 2025 14:17:46 -0500 Subject: [PATCH] fix: avoid acquiring filtered player query until movement command received --- src/systems/item.rs | 2 +- src/systems/player.rs | 39 ++++++++++++++++++--------------------- 2 files changed, 19 insertions(+), 22 deletions(-) diff --git a/src/systems/item.rs b/src/systems/item.rs index c11f040..6aefd46 100644 --- a/src/systems/item.rs +++ b/src/systems/item.rs @@ -2,7 +2,7 @@ use bevy_ecs::{ entity::Entity, event::{EventReader, EventWriter}, query::With, - system::{Commands, Query, Res, ResMut}, + system::{Commands, Query, ResMut}, }; use crate::{ diff --git a/src/systems/player.rs b/src/systems/player.rs index 3bd6599..47ef2ef 100644 --- a/src/systems/player.rs +++ b/src/systems/player.rs @@ -39,6 +39,11 @@ impl Default for PlayerLifecycle { } } +pub fn can_traverse(entity_type: EntityType, edge: Edge) -> bool { + let entity_flags = entity_type.traversal_flags(); + edge.traversal_flags.contains(entity_flags) +} + /// Processes player input commands and updates game state accordingly. /// /// Handles keyboard-driven commands like movement direction changes, debug mode @@ -50,29 +55,26 @@ pub fn player_control_system( mut state: ResMut, mut debug_state: ResMut, mut audio_state: ResMut, - mut players: Query<(&PlayerLifecycle, &mut BufferedDirection), (With, Without)>, + mut players: Query<&mut BufferedDirection, (With, Without)>, mut errors: EventWriter, ) { - // Get the player's movable component (ensuring there is only one player) - let (lifecycle, mut buffered_direction) = match players.single_mut() { - Ok(tuple) => tuple, - Err(e) => { - errors.write(GameError::InvalidState(format!( - "No/multiple entities queried for player system: {}", - e - ))); - return; - } - }; - - // If the player is not interactive or input is locked, ignore movement commands - // let allow_input = lifecycle.is_interactive(); - // Handle events for event in events.read() { if let GameEvent::Command(command) = event { match command { GameCommand::MovePlayer(direction) => { + // Get the player's movable component (ensuring there is only one player) + let (mut buffered_direction) = match players.single_mut() { + Ok(tuple) => tuple, + Err(e) => { + errors.write(GameError::InvalidState(format!( + "No/multiple entities queried for player system: {}", + e + ))); + return; + } + }; + *buffered_direction = BufferedDirection::Some { direction: *direction, remaining_time: 0.25, @@ -94,11 +96,6 @@ pub fn player_control_system( } } -pub fn can_traverse(entity_type: EntityType, edge: Edge) -> bool { - let entity_flags = entity_type.traversal_flags(); - edge.traversal_flags.contains(entity_flags) -} - /// Executes frame-by-frame movement for Pac-Man. /// /// Handles movement logic including buffered direction changes, edge traversal validation, and continuous movement between nodes.