From 93814e98411d342e32e4b458295692f1c7428903 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Tue, 24 Jun 2025 14:50:06 -0700 Subject: [PATCH] Synced resource example --- examples/sync_resource_to_ui.rs | 50 +++++++++++++++++++++++++++++++++ src/bin/hello/main.rs | 16 ----------- src/debug.rs | 2 -- src/lib.rs | 6 +++- src/ui.rs | 17 +++++++++++ 5 files changed, 72 insertions(+), 19 deletions(-) create mode 100644 examples/sync_resource_to_ui.rs delete mode 100644 src/bin/hello/main.rs create mode 100644 src/ui.rs diff --git a/examples/sync_resource_to_ui.rs b/examples/sync_resource_to_ui.rs new file mode 100644 index 0000000..4271822 --- /dev/null +++ b/examples/sync_resource_to_ui.rs @@ -0,0 +1,50 @@ +use bevy::input::mouse::MouseMotion; +use games::*; + +fn main() { + App::new() + .init_resource::() + .add_plugins(BaseGamePlugin { camera: CameraType::Camera3d }) + .add_systems(Startup, init_ui) + .add_systems(Update, ( + sync_resource_to_ui::.run_if(resource_changed::), + update_foo.run_if(on_event::) + )) + .run(); +} + +#[derive(Resource, Debug, Default)] +struct Thing(u8); + +impl Display for Thing { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{}", self.0) + } +} + +fn init_ui( + mut commands: Commands +) { + commands.spawn(( + Node { + align_self: AlignSelf::Start, + justify_self: JustifySelf::Center, + ..default() + }, + Text("Displays a sync'd resource tracking the number of mouse events (mod 256)".into()), + )); + commands.spawn((Node { + align_self: AlignSelf::Center, + justify_self: JustifySelf::Center, + ..default() + }, Text("Placeholder".into()), SyncResource::::default())); +} + +fn update_foo( + mut events: EventReader, + mut thing: ResMut, +) { + events.read().for_each(|_| { + thing.0 = thing.0.overflowing_add(1).0; + }); +} diff --git a/src/bin/hello/main.rs b/src/bin/hello/main.rs deleted file mode 100644 index 3890900..0000000 --- a/src/bin/hello/main.rs +++ /dev/null @@ -1,16 +0,0 @@ -use games::*; - -fn main() { - App::new() - .add_plugins(BaseGamePlugin { camera: CameraType::Camera3d }) - .add_systems(Update, ( - f.run_if(any_component_added::), - f.run_if(any_component_changed::), - )) - .run(); -} - -#[derive(Component)] -struct Foo; - -fn f() { } diff --git a/src/debug.rs b/src/debug.rs index 8ba4a84..2faf811 100644 --- a/src/debug.rs +++ b/src/debug.rs @@ -1,5 +1,3 @@ -use bevy::color::palettes::css::{BLACK, RED, WHITE}; - use super::*; /// Debugging systems, resources, events, etc. diff --git a/src/lib.rs b/src/lib.rs index 90ce33f..9f4e660 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,13 @@ mod base_game; mod debug; mod scheduling; +mod ui; -pub use bevy::{prelude::*, input::{keyboard::KeyboardInput, ButtonState}}; +pub use std::fmt::Display; + +pub use bevy::{prelude::*, input::{keyboard::KeyboardInput, ButtonState}, color::palettes::css::{BLACK, RED, WHITE}}; pub use base_game::*; pub use debug::*; pub use scheduling::*; +pub use ui::*; diff --git a/src/ui.rs b/src/ui.rs new file mode 100644 index 0000000..4d1fce1 --- /dev/null +++ b/src/ui.rs @@ -0,0 +1,17 @@ +use super::*; + +/// Marker component for handling Resource -> Ui Sync +#[derive(Component, Default, Debug)] +pub struct SyncResource(R); + +/// Sync a generic resource to the UI +/// +/// Mostly useful for quick n' dirty getting data to the user +pub fn sync_resource_to_ui( + mut q: Query<&mut Text, With>>, + r: Res, +) { + q.iter_mut().for_each(|mut t| { + t.0 = format!("{}", *r); + }); +}