mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-17 12:12:41 -06:00
refactor: store common components & bundles in 'common' submodule, move others directly into relevant files, create 'animation' submodule
This commit is contained in:
43
src/systems/common/bundles.rs
Normal file
43
src/systems/common/bundles.rs
Normal file
@@ -0,0 +1,43 @@
|
||||
use bevy_ecs::bundle::Bundle;
|
||||
|
||||
use crate::systems::{
|
||||
BufferedDirection, Collider, DirectionalAnimation, EntityType, Ghost, GhostCollider, GhostState, ItemCollider,
|
||||
LastAnimationState, MovementModifiers, PacmanCollider, PlayerControlled, Position, Renderable, Velocity,
|
||||
};
|
||||
|
||||
#[derive(Bundle)]
|
||||
pub struct PlayerBundle {
|
||||
pub player: PlayerControlled,
|
||||
pub position: Position,
|
||||
pub velocity: Velocity,
|
||||
pub buffered_direction: BufferedDirection,
|
||||
pub sprite: Renderable,
|
||||
pub directional_animation: DirectionalAnimation,
|
||||
pub entity_type: EntityType,
|
||||
pub collider: Collider,
|
||||
pub movement_modifiers: MovementModifiers,
|
||||
pub pacman_collider: PacmanCollider,
|
||||
}
|
||||
|
||||
#[derive(Bundle)]
|
||||
pub struct ItemBundle {
|
||||
pub position: Position,
|
||||
pub sprite: Renderable,
|
||||
pub entity_type: EntityType,
|
||||
pub collider: Collider,
|
||||
pub item_collider: ItemCollider,
|
||||
}
|
||||
|
||||
#[derive(Bundle)]
|
||||
pub struct GhostBundle {
|
||||
pub ghost: Ghost,
|
||||
pub position: Position,
|
||||
pub velocity: Velocity,
|
||||
pub sprite: Renderable,
|
||||
pub directional_animation: DirectionalAnimation,
|
||||
pub entity_type: EntityType,
|
||||
pub collider: Collider,
|
||||
pub ghost_collider: GhostCollider,
|
||||
pub ghost_state: GhostState,
|
||||
pub last_animation_state: LastAnimationState,
|
||||
}
|
||||
103
src/systems/common/components.rs
Normal file
103
src/systems/common/components.rs
Normal file
@@ -0,0 +1,103 @@
|
||||
use bevy_ecs::{component::Component, resource::Resource};
|
||||
|
||||
use crate::map::graph::TraversalFlags;
|
||||
|
||||
/// A tag component denoting the type of entity.
|
||||
#[derive(Component, Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||
pub enum EntityType {
|
||||
Player,
|
||||
Ghost,
|
||||
Pellet,
|
||||
PowerPellet,
|
||||
}
|
||||
|
||||
impl EntityType {
|
||||
/// Returns the traversal flags for this entity type.
|
||||
pub fn traversal_flags(&self) -> TraversalFlags {
|
||||
match self {
|
||||
EntityType::Player => TraversalFlags::PACMAN,
|
||||
EntityType::Ghost => TraversalFlags::GHOST,
|
||||
_ => TraversalFlags::empty(), // Static entities don't traverse
|
||||
}
|
||||
}
|
||||
pub fn score_value(&self) -> Option<u32> {
|
||||
match self {
|
||||
EntityType::Pellet => Some(10),
|
||||
EntityType::PowerPellet => Some(50),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_collectible(&self) -> bool {
|
||||
matches!(self, EntityType::Pellet | EntityType::PowerPellet)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct GlobalState {
|
||||
pub exit: bool,
|
||||
}
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct ScoreResource(pub u32);
|
||||
|
||||
#[derive(Resource)]
|
||||
pub struct DeltaTime {
|
||||
/// Floating-point delta time in seconds
|
||||
pub seconds: f32,
|
||||
/// Integer tick delta (usually 1, but can be different for testing)
|
||||
pub ticks: u32,
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
impl DeltaTime {
|
||||
/// Creates a new DeltaTime from a floating-point delta time in seconds
|
||||
///
|
||||
/// While this method exists as a helper, it does not mean that seconds and ticks are interchangeable.
|
||||
pub fn from_seconds(seconds: f32) -> Self {
|
||||
Self {
|
||||
seconds,
|
||||
ticks: (seconds * 60.0).round() as u32,
|
||||
}
|
||||
}
|
||||
|
||||
/// Creates a new DeltaTime from an integer tick delta
|
||||
///
|
||||
/// While this method exists as a helper, it does not mean that seconds and ticks are interchangeable.
|
||||
pub fn from_ticks(ticks: u32) -> Self {
|
||||
Self {
|
||||
seconds: ticks as f32 / 60.0,
|
||||
ticks,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Movement modifiers that can affect Pac-Man's speed or handling.
|
||||
#[derive(Component, Debug, Clone, Copy)]
|
||||
pub struct MovementModifiers {
|
||||
/// Multiplier applied to base speed (e.g., tunnels)
|
||||
pub speed_multiplier: f32,
|
||||
/// True when currently in a tunnel slowdown region
|
||||
pub tunnel_slowdown_active: bool,
|
||||
}
|
||||
|
||||
impl Default for MovementModifiers {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
speed_multiplier: 1.0,
|
||||
tunnel_slowdown_active: false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Tag component for entities that should be frozen during startup
|
||||
#[derive(Component, Debug, Clone, Copy)]
|
||||
pub struct Frozen;
|
||||
|
||||
/// Component for HUD life sprite entities.
|
||||
/// Each life sprite entity has an index indicating its position from left to right (0, 1, 2, etc.).
|
||||
/// This mostly functions as a tag component for sprites.
|
||||
#[derive(Component, Debug, Clone, Copy)]
|
||||
pub struct PlayerLife {
|
||||
pub index: u32,
|
||||
}
|
||||
5
src/systems/common/mod.rs
Normal file
5
src/systems/common/mod.rs
Normal file
@@ -0,0 +1,5 @@
|
||||
pub mod bundles;
|
||||
pub mod components;
|
||||
|
||||
pub use self::bundles::*;
|
||||
pub use self::components::*;
|
||||
Reference in New Issue
Block a user