emerald 0.3.214

A lite, fully featured 2D game engine.
Documentation
use emerald::{parry::shape::Cuboid, *};
use nalgebra::Point2;

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

pub struct RaycastExample {
    world: World,
}
impl Game for RaycastExample {
    fn initialize(&mut self, mut emd: Emerald) {
        emd.set_asset_folder_root(String::from("./examples/assets/"));
        let sprite = emd.loader().sprite("bunny.png").unwrap();

        let (_, rbh1) = self
            .world
            .spawn_with_body(
                (
                    sprite.clone(),
                    Transform::from_translation((200.0, 0.0)),
                    String::from("entity on the right"),
                ),
                RigidBodyBuilder::new_static(),
            )
            .unwrap();
        let (_, rbh2) = self
            .world
            .spawn_with_body(
                (
                    sprite.clone(),
                    Transform::from_translation((-200.0, 0.0)),
                    String::from("entity on the left"),
                ),
                RigidBodyBuilder::fixed(),
            )
            .unwrap();
        let (_, rbh3) = self
            .world
            .spawn_with_body(
                (
                    sprite.clone(),
                    Transform::from_translation((90.0, 200.0)),
                    String::from("entity on the top"),
                ),
                RigidBodyBuilder::fixed(),
            )
            .unwrap();
        let (_, rbh4) = self
            .world
            .spawn_with_body(
                (
                    sprite.clone(),
                    Transform::from_translation((-40.0, -200.0)),
                    String::from("entity on the bottom"),
                ),
                RigidBodyBuilder::fixed(),
            )
            .unwrap();

        self.world
            .physics()
            .build_collider(rbh1, ColliderBuilder::cuboid(20.0, 20.0));
        self.world
            .physics()
            .build_collider(rbh2, ColliderBuilder::cuboid(20.0, 20.0));

        self.world
            .physics()
            .build_collider(rbh3, ColliderBuilder::cuboid(20.0, 20.0));
        self.world
            .physics()
            .build_collider(rbh4, ColliderBuilder::cuboid(20.0, 20.0));
    }

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

        if emd.input().is_key_just_pressed(KeyCode::Left) {
            ray = Some(Ray::new(Point2::new(0.0, 0.0), Vector2::new(-500.0, 0.0)));
        } else if emd.input().is_key_just_pressed(KeyCode::Right) {
            ray = Some(Ray::new(Point2::new(0.0, 0.0), Vector2::new(500.0, 0.0)));
        }

        if let Some(ray) = ray {
            let entity = self.world.physics().cast_ray(RayCastQuery {
                ray,
                ..RayCastQuery::default()
            });

            if let Some(e) = entity {
                if let Ok(s) = self.world.get::<&String>(e) {
                    println!("Found {:?}", *s);
                }
            }
        }

        let mut vel = None;

        if emd.input().is_key_just_pressed(KeyCode::Up) {
            vel = Some(Vector2::new(0.0, 50.0));
        } else if emd.input().is_key_just_pressed(KeyCode::Down) {
            vel = Some(Vector2::new(0.0, -50.0));
        }

        if let Some(vel) = vel {
            let shape = Cuboid::new(Vector2::new(40.0, 10.0));

            let entity = self.world.physics().cast_shape(
                &shape,
                ShapeCastQuery {
                    velocity: vel,
                    origin_translation: Translation::default(),
                    max_toi: 30.0,
                    ..ShapeCastQuery::default()
                },
            );

            if let Some(e) = entity {
                if let Ok(s) = self.world.get::<&String>(e) {
                    println!("Found {:?}", *s);
                }
            }
        }

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

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