use bevy::prelude::*;
use bevy::scene::prelude::{bsn, CommandsSceneExt};
use bevy_gearbox::prelude::*;
use bevy_gearbox::GearboxPlugin;
#[derive(Message, Clone, Reflect, GearboxMessage)]
struct Toggle {
#[gearbox(target)]
machine: Entity,
}
#[derive(Component)]
struct Bulb;
const OFF: Color = Color::srgb(0.25, 0.25, 0.3);
const ON: Color = Color::srgb(1.0, 0.9, 0.3);
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(GearboxPlugin::default())
.add_plugins(editor_server)
.add_systems(Startup, setup)
.add_systems(Update, toggle_on_space.before(GearboxSet))
.add_systems(Update, paint_bulb.after(GearboxSet))
.run();
}
fn setup(mut commands: Commands) {
commands.spawn(Camera2d);
commands.spawn((
Text2d::new("Press <Space> to toggle the light"),
TextColor(Color::WHITE),
Transform::from_xyz(0.0, 200.0, 0.0),
));
commands.spawn((
Bulb,
Sprite::from_color(OFF, Vec2::splat(120.0)),
Transform::default(),
));
commands.spawn_scene(bsn! {
#Light
StateMachineId("light")
StateMachine InitialState(#Off)
Substates [
#Off Transitions [ (Target(#On) MessageEdge::<Toggle>) ],
#On Transitions [ (Target(#Off) MessageEdge::<Toggle>) ],
]
});
}
fn toggle_on_space(
keys: Res<ButtonInput<KeyCode>>,
machine: Single<Entity, With<StateMachine>>,
mut writer: MessageWriter<Toggle>,
) {
if keys.just_pressed(KeyCode::Space) {
writer.write(Toggle { machine: *machine });
}
}
fn paint_bulb(
q_entered: Query<&Name, Added<Active>>,
mut bulb: Single<&mut Sprite, With<Bulb>>,
) {
for name in &q_entered {
match name.as_str() {
"On" => bulb.color = ON,
"Off" => bulb.color = OFF,
_ => {}
}
}
}
fn editor_server(app: &mut App) {
#[cfg(feature = "server")]
app.add_plugins(bevy_gearbox::server::ServerPlugin::default());
#[cfg(not(feature = "server"))]
let _ = app;
}