feat: allow freezing of blinking entities, lightly refactor game.rs structure

This commit is contained in:
Ryan Walters
2025-08-28 20:02:27 -05:00
parent d0628ef70b
commit cde1ea5394
3 changed files with 77 additions and 45 deletions

View File

@@ -7,15 +7,21 @@ use bevy_ecs::{
use crate::systems::{
components::{DeltaTime, Renderable},
Hidden,
Frozen, Hidden,
};
#[derive(Component)]
#[derive(Component, Debug)]
pub struct Blinking {
pub timer: f32,
pub interval: f32,
}
impl Blinking {
pub fn new(interval: f32) -> Self {
Self { timer: 0.0, interval }
}
}
/// Updates blinking entities by toggling their visibility at regular intervals.
///
/// This system manages entities that have both `Blinking` and `Renderable` components,
@@ -23,20 +29,34 @@ pub struct Blinking {
pub fn blinking_system(
mut commands: Commands,
time: Res<DeltaTime>,
mut query: Query<(Entity, &mut Blinking, Has<Hidden>), With<Renderable>>,
mut query: Query<(Entity, &mut Blinking, Has<Hidden>, Has<Frozen>), With<Renderable>>,
) {
for (entity, mut blinking, hidden) in query.iter_mut() {
blinking.timer += time.0;
if blinking.timer >= blinking.interval {
blinking.timer = 0.0;
// Add or remove the Visible component based on whether it is currently in the query
for (entity, mut blinking, hidden, frozen) in query.iter_mut() {
// If the entity is frozen, blinking is disabled and the entity is unhidden (if it was hidden)
if frozen {
if hidden {
commands.entity(entity).remove::<Hidden>();
} else {
commands.entity(entity).insert(Hidden);
}
continue;
}
// Increase the timer by the delta time
blinking.timer += time.0;
// If the timer is less than the interval, there's nothing to do yet
if blinking.timer < blinking.interval {
continue;
}
// Subtract the interval (allows for the timer to retain partial interval progress)
blinking.timer -= blinking.interval;
// Toggle the Hidden component
if hidden {
commands.entity(entity).remove::<Hidden>();
} else {
commands.entity(entity).insert(Hidden);
}
}
}