#![feature(coroutines, coroutine_trait)]
use bevy::prelude::*;
use bevy_coroutine_system::prelude::*;
use std::time::Duration;
fn main() {
let mut app = App::new();
app.add_plugins((DefaultPlugins, CoroutinePlugin))
.add_systems(Startup, setup)
.add_systems(Update, trigger_animation);
app.register_coroutine(box_animation, box_animation::id());
app.run();
}
fn setup(mut commands: Commands) {
commands.spawn(Camera2d);
commands.spawn((
Sprite {
color: Color::WHITE,
custom_size: Some(Vec2::new(100.0, 100.0)),
..default()
},
Transform::from_xyz(0.0, 0.0, 0.0),
AnimatedBox,
));
commands.spawn((
Text2d::new("Press SPACE to start animation"),
TextFont {
font_size: 24.0,
..default()
},
Transform::from_xyz(0.0, 250.0, 0.0),
StatusText,
));
}
#[derive(Component)]
struct AnimatedBox;
#[derive(Component)]
struct StatusText;
fn trigger_animation(
mut commands: Commands,
keyboard: Res<ButtonInput<KeyCode>>,
) {
if keyboard.just_pressed(KeyCode::Space) {
commands.run_system_cached(box_animation);
}
}
#[coroutine_system]
fn box_animation(
mut box_query: Query<&mut Transform, With<AnimatedBox>>,
mut text_query: Query<&mut Text2d, With<StatusText>>,
) {
info!("Animation started!");
for mut text in text_query.iter_mut() {
**text = "Scaling up...".to_string();
}
for _ in 0..30 {
yield next_frame();
for mut transform in box_query.iter_mut() {
transform.scale *= 1.02;
}
}
yield sleep(Duration::from_millis(300));
for mut text in text_query.iter_mut() {
**text = "Moving and rotating...".to_string();
}
for _ in 0..60 {
yield next_frame();
for mut transform in box_query.iter_mut() {
transform.translation.x += 2.0;
transform.rotate_z(0.02);
}
}
yield sleep(Duration::from_millis(500));
for mut text in text_query.iter_mut() {
**text = "Returning...".to_string();
}
for _ in 0..60 {
yield next_frame();
for mut transform in box_query.iter_mut() {
transform.translation.x -= 2.0;
transform.rotate_z(-0.02);
}
}
for _ in 0..30 {
yield next_frame();
for mut transform in box_query.iter_mut() {
transform.scale /= 1.02;
}
}
yield noop();
for mut text in text_query.iter_mut() {
**text = "Animation complete! Press SPACE to restart".to_string();
}
info!("Animation completed!");
}