mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-13 20:12:21 -06:00
fix: avoid acquiring filtered player query until movement command received
This commit is contained in:
@@ -2,7 +2,7 @@ use bevy_ecs::{
|
|||||||
entity::Entity,
|
entity::Entity,
|
||||||
event::{EventReader, EventWriter},
|
event::{EventReader, EventWriter},
|
||||||
query::With,
|
query::With,
|
||||||
system::{Commands, Query, Res, ResMut},
|
system::{Commands, Query, ResMut},
|
||||||
};
|
};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|||||||
@@ -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.
|
/// Processes player input commands and updates game state accordingly.
|
||||||
///
|
///
|
||||||
/// Handles keyboard-driven commands like movement direction changes, debug mode
|
/// Handles keyboard-driven commands like movement direction changes, debug mode
|
||||||
@@ -50,29 +55,26 @@ pub fn player_control_system(
|
|||||||
mut state: ResMut<GlobalState>,
|
mut state: ResMut<GlobalState>,
|
||||||
mut debug_state: ResMut<DebugState>,
|
mut debug_state: ResMut<DebugState>,
|
||||||
mut audio_state: ResMut<AudioState>,
|
mut audio_state: ResMut<AudioState>,
|
||||||
mut players: Query<(&PlayerLifecycle, &mut BufferedDirection), (With<PlayerControlled>, Without<Frozen>)>,
|
mut players: Query<&mut BufferedDirection, (With<PlayerControlled>, Without<Frozen>)>,
|
||||||
mut errors: EventWriter<GameError>,
|
mut errors: EventWriter<GameError>,
|
||||||
) {
|
) {
|
||||||
// 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
|
// Handle events
|
||||||
for event in events.read() {
|
for event in events.read() {
|
||||||
if let GameEvent::Command(command) = event {
|
if let GameEvent::Command(command) = event {
|
||||||
match command {
|
match command {
|
||||||
GameCommand::MovePlayer(direction) => {
|
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 {
|
*buffered_direction = BufferedDirection::Some {
|
||||||
direction: *direction,
|
direction: *direction,
|
||||||
remaining_time: 0.25,
|
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.
|
/// Executes frame-by-frame movement for Pac-Man.
|
||||||
///
|
///
|
||||||
/// Handles movement logic including buffered direction changes, edge traversal validation, and continuous movement between nodes.
|
/// Handles movement logic including buffered direction changes, edge traversal validation, and continuous movement between nodes.
|
||||||
|
|||||||
Reference in New Issue
Block a user