From 8d583642e9616bc1baf5b71b650c14d36b78d7c6 Mon Sep 17 00:00:00 2001 From: Jaroslaw Konik Date: Sun, 18 May 2025 22:44:14 +0200 Subject: [PATCH] add ruby example --- Cargo.toml | 5 +++ .../examples/ruby/call_function_from_rust.rb | 13 ++++++++ examples/ruby/call_function_from_rust.rs | 33 +++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 assets/examples/ruby/call_function_from_rust.rb create mode 100644 examples/ruby/call_function_from_rust.rs diff --git a/Cargo.toml b/Cargo.toml index 240f3f5..832862c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -154,6 +154,11 @@ name = "function_return_value_lua" path = "examples/lua/function_return_value.rs" required-features = ["lua"] +[[example]] +name = "call_function_from_rust_ruby" +path = "examples/ruby/call_function_from_rust.rs" +required-features = ["ruby"] + [dev-dependencies] tracing-subscriber = "0.3.18" mlua = { version = "0.9.8", features = ["luajit", "vendored", "send"] } diff --git a/assets/examples/ruby/call_function_from_rust.rb b/assets/examples/ruby/call_function_from_rust.rb new file mode 100644 index 0000000..a5adb3b --- /dev/null +++ b/assets/examples/ruby/call_function_from_rust.rb @@ -0,0 +1,13 @@ +$my_state = { + iterations: 0, +} + +def on_update + $my_state[:iterations] += 1 + puts("on_update called #{$my_state[:iterations]} times") + + if $my_state[:iterations] >= 10 + print("calling quit"); + quit() + end +end diff --git a/examples/ruby/call_function_from_rust.rs b/examples/ruby/call_function_from_rust.rs new file mode 100644 index 0000000..039170e --- /dev/null +++ b/examples/ruby/call_function_from_rust.rs @@ -0,0 +1,33 @@ +use bevy::{app::AppExit, prelude::*}; +use bevy_scriptum::prelude::*; +use bevy_scriptum::runtimes::ruby::prelude::*; + +fn main() { + App::new() + .add_plugins(DefaultPlugins) + .add_systems(Startup, startup) + .add_systems(Update, call_ruby_on_update_from_rust) + .add_scripting::(|runtime| { + runtime.add_function(String::from("quit"), |mut exit: EventWriter| { + exit.write(AppExit::Success); + }); + }) + .run(); +} + +fn startup(mut commands: Commands, assets_server: Res) { + commands.spawn(Script::::new( + assets_server.load("examples/ruby/call_function_from_rust.rb"), + )); +} + +fn call_ruby_on_update_from_rust( + mut scripted_entities: Query<(Entity, &mut RubyScriptData)>, + scripting_runtime: ResMut, +) { + for (entity, mut script_data) in &mut scripted_entities { + scripting_runtime + .call_fn("on_update", &mut script_data, entity, ()) + .unwrap(); + } +}