emerald 0.3.214

A lite, fully featured 2D game engine.
Documentation
use std::time::Duration;

use emerald::*;

pub fn main() {
    emerald::start(
        Box::new(WorldMergingExample {
            world: World::new(),
        }),
        GameSettings::default(),
    )
}

pub struct WorldMergingExample {
    world: World,
}
impl Game for WorldMergingExample {
    fn initialize(&mut self, mut emd: Emerald) {
        emd.set_asset_folder_root(String::from("./examples/assets/"));
        let sprite = emd.loader().sprite("bunny.png").unwrap();
        self.world.spawn((sprite, Transform::default()));
        self.world.physics().set_gravity(Vector2::new(0.0, -19.8));
    }

    fn update(&mut self, mut emd: Emerald) {
        let mut input = emd.input();

        if input.is_key_just_pressed(KeyCode::A) {
            let amount = 100;
            let world = build_other_world(
                &mut emd,
                Transform::from_translation((100.0, 100.0)),
                amount,
            )
            .unwrap();
            let now = emd.now();
            self.world
                .merge(world, Transform::from_translation((100.0, 100.0)))
                .unwrap();
            let after = emd.now();
            println!(
                "merged {} bunnies in {:?}us",
                amount,
                Duration::from_secs_f64(after - now).as_micros()
            );
        }

        self.world.physics().step(emd.delta());
    }

    fn draw(&mut self, mut emd: Emerald) {
        emd.graphics().begin().unwrap();
        emd.graphics().draw_world(&mut self.world).unwrap();
        emd.graphics().render().unwrap();
    }
}

fn build_other_world(
    emd: &mut Emerald,
    offset: Transform,
    amount: i32,
) -> Result<World, EmeraldError> {
    let mut world = World::new();
    let sprite = emd.loader().sprite("bunny.png")?;
    let amount = (amount as f32).sqrt() as usize;

    for x in 0..amount {
        for y in 0..amount {
            let (_entity, rbh) = world
                .spawn_with_body(
                    (
                        Transform::from_translation((
                            x as f32 * 30.0 - 300.0,
                            y as f32 * 30.0 - 300.0,
                        )) + offset,
                        sprite.clone(),
                    ),
                    RigidBodyBuilder::dynamic()
                        .can_sleep(false)
                        .linvel(Vector2::new(10.0, 10.0)),
                )
                .unwrap();

            world
                .physics()
                .build_collider(rbh, ColliderBuilder::cuboid(1.0, 1.0));
        }
    }

    Ok(world)
}