fn main() {
println!(" ══════════════════════════════════════════════");
println!(" Bevy Bounce Example — SpandaPlugin Demo");
println!(" ══════════════════════════════════════════════\n");
println!(" This example demonstrates spanda's Bevy integration.");
println!(" To run the full Bevy example, use:\n");
println!(" cargo run --example bevy_bounce --features bevy\n");
println!(" The SpandaPlugin provides:");
println!(" - Auto-ticking of Tween<f32/[f32;2]/[f32;3]/[f32;4]> components");
println!(" - Auto-ticking of Spring components");
println!(" - TweenCompleted event when tweens finish");
println!(" - SpringSettled event when springs reach their target\n");
use spanda::spring::{Spring, SpringConfig, SpringN};
use spanda::traits::Update;
println!(" ── Spring (f32) ──\n");
let mut spring = Spring::new(SpringConfig::wobbly()).with_position(0.0);
spring.set_target(100.0);
println!(
" {:>6} {:>10} {:>10} {:>8}",
"frame", "position", "velocity", "settled"
);
for frame in 0..30 {
spring.update(1.0 / 60.0);
if frame % 3 == 0 {
println!(
" {:>6} {:>10.2} {:>10.2} {:>8}",
frame,
spring.position(),
spring.velocity(),
spring.is_settled(),
);
}
}
println!("\n ── SpringN<[f32; 2]> (2D) ──\n");
let mut spring2d = SpringN::new(SpringConfig::wobbly(), [0.0_f32, 0.0]);
spring2d.set_target([100.0, 200.0]);
println!(
" {:>6} {:>10} {:>10} {:>8}",
"frame", "x", "y", "settled"
);
for frame in 0..60 {
spring2d.update(1.0 / 60.0);
if frame % 6 == 0 {
let pos = spring2d.position();
println!(
" {:>6} {:>10.2} {:>10.2} {:>8}",
frame,
pos[0],
pos[1],
spring2d.is_settled(),
);
}
}
println!("\n ── SpringN<[f32; 3]> (3D) ──\n");
let mut spring3d = SpringN::new(SpringConfig::stiff(), [0.0_f32, 0.0, 0.0]);
spring3d.set_target([50.0, 100.0, 150.0]);
for _ in 0..1000 {
spring3d.update(1.0 / 60.0);
}
let pos = spring3d.position();
println!(
" Final 3D position: ({:.2}, {:.2}, {:.2})",
pos[0], pos[1], pos[2]
);
println!(" Settled: {}\n", spring3d.is_settled());
}