delay
The delay module defines actions that perform delay processing. These are useful for waiting for a specific amount of time or a specific number of frames.
Basic Usage
The delay module provides two main functions:
time
The time function delays the execution for a specified amount of time.
#![allow(unused)]
fn main() {
use bevy::prelude::*;
use bevy_flurx::prelude::*;
use core::time::Duration;
fn spawn_reactor(mut commands: Commands) {
commands.spawn(Reactor::schedule(|task| async move {
// Delay for 1 second
task.will(Update, delay::time().with(Duration::from_secs(1))).await;
// Delay for 500 milliseconds
task.will(Update, delay::time().with(Duration::from_millis(500))).await;
}));
}
}
Under the hood, delay::time() uses a Timer with TimerMode::Once to track the elapsed time. The action completes when the timer finishes.
frames
The frames function delays the execution for a specified number of frames.
#![allow(unused)]
fn main() {
use bevy::prelude::*;
use bevy_flurx::prelude::*;
fn spawn_reactor(mut commands: Commands) {
commands.spawn(Reactor::schedule(|task| async move {
// Delay for 30 frames
task.will(Update, delay::frames().with(30)).await;
// Delay for 5 frames
task.will(Update, delay::frames().with(5)).await;
}));
}
}
Under the hood, delay::frames() uses a Local<usize> to track the number of frames that have passed. The action completes when the specified number of frames have been processed.
Combining with Other Actions
The delay actions can be combined with other actions using the then, pipe, and through methods.
then
The then method allows you to execute an action after a delay.
#![allow(unused)]
fn main() {
use bevy::prelude::*;
use bevy_flurx::prelude::*;
use core::time::Duration;
fn spawn_reactor(mut commands: Commands) {
commands.spawn(Reactor::schedule(|task| async move {
// Delay for 1 second, then send an event
task.will(Update, delay::time().with(Duration::from_secs(1))
.then(once::message::app_exit_success())
).await;
}));
}
}
through
The through method allows you to delay the output of a previous action.
#![allow(unused)]
fn main() {
use bevy::prelude::*;
use bevy_flurx::prelude::*;
use core::time::Duration;
fn spawn_reactor(mut commands: Commands) {
commands.spawn(Reactor::schedule(|task| async move {
// Get a value, then delay for 1 second before returning it
let value = task.will(Update, once::run(|count: Res<Count>| {
count.0
}).through(delay::time().with(Duration::from_secs(1)))).await;
}));
}
}
Examples
Delayed Animation
#![allow(unused)]
fn main() {
use bevy::prelude::*;
use bevy_flurx::prelude::*;
use core::time::Duration;
fn spawn_reactor(mut commands: Commands) {
commands.spawn(Reactor::schedule(|task| async move {
// Spawn an entity
let entity = task.will(Update, once::run(|mut commands: Commands| {
commands.spawn(SpriteBundle {
sprite: Sprite {
color: Color::RED,
custom_size: Some(Vec2::new(50.0, 50.0)),
..default()
},
transform: Transform::from_translation(Vec3::new(-100.0, 0.0, 0.0)),
..default()
}).id()
})).await;
// Move the entity to the right over time
for i in 0..10 {
task.will(Update, once::run(move |mut transforms: Query<&mut Transform>| {
let mut transform = transforms.get_mut(entity).unwrap();
transform.translation.x += 20.0;
})).await;
// Delay between movements
task.will(Update, delay::time().with(Duration::from_millis(100))).await;
}
}));
}
}
Frame-Based Animation
#![allow(unused)]
fn main() {
use bevy::prelude::*;
use bevy_flurx::prelude::*;
fn spawn_reactor(mut commands: Commands) {
commands.spawn(Reactor::schedule(|task| async move {
// Spawn an entity
let entity = task.will(Update, once::run(|mut commands: Commands| {
commands.spawn(SpriteBundle {
sprite: Sprite {
color: Color::BLUE,
custom_size: Some(Vec2::new(50.0, 50.0)),
..default()
},
transform: Transform::from_translation(Vec3::new(0.0, -100.0, 0.0)),
..default()
}).id()
})).await;
// Move the entity upward over frames
for i in 0..10 {
task.will(Update, once::run(move |mut transforms: Query<&mut Transform>| {
let mut transform = transforms.get_mut(entity).unwrap();
transform.translation.y += 20.0;
})).await;
// Delay between movements
task.will(Update, delay::frames().with(5)).await;
}
}));
}
}