#bevy #user-input #async #gamedev #io #documentation

bevy_flurx

Allows you to write sequential description of processes involving delays, user input, and other waits

23 releases (6 breaking)

new 0.9.0 Jan 13, 2025
0.8.3 Dec 29, 2024
0.7.0 Dec 8, 2024
0.6.0 Aug 4, 2024
0.3.0 Mar 14, 2024

#67 in Game dev

Download history 45/week @ 2024-09-23 7/week @ 2024-09-30 7/week @ 2024-10-14 13/week @ 2024-11-04 6/week @ 2024-11-18 2/week @ 2024-11-25 150/week @ 2024-12-02 170/week @ 2024-12-09 364/week @ 2024-12-16 115/week @ 2024-12-23 84/week @ 2024-12-30 34/week @ 2025-01-06

617 downloads per month
Used in 7 crates

MIT/Apache

615KB
6K SLoC

bevy_flurx

Crates.io MIT/Apache 2.0 Crates.io

This library offers a mechanism for more sequential descriptions of delays, character movement, waiting for user input, and other state waits. Reactor can be used incrementally, meaning there’s no need to rewrite existing applications to incorporate it. I recommend this partial usage since the system that runs Reactor and the systems executed by Reactor operate on the main thread. For multithreaded operation, please check the Switch.

//! Here are some basic [once], [wait], [delay], [then], [pipe] and [through] actions.
//!
//! For details on all actions, please check [here](https://docs.rs/bevy_flurx/latest/bevy_flurx/action/index.html).
//!
//! [once]: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/once/index.html
//! [wait]: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/wait/index.html
//! [delay]: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/delay/index.html
//! [then]: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/sequence/trait.Then.html#tymethod.then
//! [pipe]: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/pipe/trait.Pipe.html#tymethod.pipe
//! [through]: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/through/fn.through.html

use bevy::prelude::*;
use bevy_flurx::prelude::*;
use std::time::Duration;

fn main() {
    App::new()
        .insert_resource(Count(0))
        .add_plugins((
            DefaultPlugins,
            FlurxPlugin,
        ))
        .add_systems(Startup, spawn_reactor)
        .run();
}

#[derive(Resource)]
struct Count(usize);

fn spawn_reactor(mut commands: Commands) {
    commands.spawn(Reactor::schedule(|task| async move {
        // `once` module defines the actions that runs only once.
        // For example, once::run once executes any system.
        // other once actions: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/once/index.html
        let current_count: usize = task.will(Update, once::run(|mut count: ResMut<Count>| {
            count.0 += 1;
            count.0
        })).await;
        assert_eq!(current_count, 1);

        // ActionSeed and Action have input and output the generic types.
        // You can call `ActionSeed::with(<input>)` to pass the input to action seed.
        let result: usize = task.will(Update, once::run(|In(num): In<usize>| {
            num + 3
        }).with(3)).await;
        assert_eq!(result, 6);

        // The wait module defines actions that continue to execute every frame according to specified conditions.
        // For example, wait::until takes a system that returns a bool value and continues to execute it until it returns true.
        // other wait actions: https://docs.rs/bevy_flurx/latest/bevy_flurx/action/wait/index.html
        task.will(Update, wait::until(|mut count: ResMut<Count>| {
            count.0 += 1;
            info!("current count: {}", count.0);
            count.0 == 4
        })).await;

        // delay module defines the actions that perform delay processing.
        task.will(Update, delay::time().with(std::time::Duration::from_secs(1))).await;

        // `then`, `pipe` and through`  are also actions that continues to execute another action.
        let message = task.will(Update, {
            delay::frames().with(30)
                .then(once::run(|count: Res<Count>| {
                    count.0
                }))
                // Pipes the output of an action to the input of the next action.
                .pipe(once::run(|In(count): In<usize>| {
                    format!("count is {count}")
                }))
                // Executes the next while keeping the output of the previous action.
                .through(delay::time().with(Duration::from_secs(1)))
        }).await;
        assert_eq!(message, "count is 4");

        info!("Done!");
        task.will(Update, once::event::app_exit_success()).await;
    }));
}

Example

All examples are here.

Feature flags

flag name short description default
audio audio actions false
record undo/redo actions and events false
effect thread/async side effects false
state state actions false
tokio async-compat and async actions false

audio

Provides the actions that perform simple audio playback and waiting using bevy's default audio functionality.

record

doc.rs

Provides Record to manage operation history.

undo_redo

effect

doc.rs

Allows to convert the operations with side effects such as asynchronous runtime or thread into the referential-transparent actions.

tokio

You will be able to write processes that depend on tokio's runtime in the reactor.

ChangeLog

Please see here.

Compatible Bevy versions

bevy_flurx bevy
0.3.0 ~ 0.13.0
0.6.0 ~ 0.14.1
0.7.0 ~ 0.15

License

This crate is licensed under the MIT License or the Apache License 2.0.

Dependencies

~21–52MB
~862K SLoC