Hacker News new | past | comments | ask | show | jobs | submit login
Show HN: ABC Game Engine (abc-engine.com)
1 point by NoodlesOfWrath 83 days ago | hide | past | favorite
Hey HN! I have a background in Unity. Recently, I switched to Rust, but when I tried building a small game in Bevy it was difficult to pick up multithreaded entity components coming from a single-threaded game engine. ABC Game Engine aims to make it easier for users coming from Unity to pick up game development in Rust.

Here's a simple example of a player controller in ABC Game Engine:

    struct PlayerController {
        speed: f32,
        jump_force: f32,
    }
    
    impl System for PlayerController {
        fn run(&mut self, entities_and_components: &mut EntitiesAndComponents) {
            let player_entity;
            let (player_x, player_y) = {
                let player_entities = entities_and_components
                    .get_entities_with_component::<Player>()
                    .cloned()
                    .collect::<Vec<Entity>>();
    
                player_entity = player_entities[0];
    
                let (transform,) =
                    entities_and_components.get_components::<(Transform,)>(player_entity);
                (transform.x, transform.y)
            };
    
            let delta_time: f32;
            let mut normalized_dir = [0.0 as f32; 2];
            {
                delta_time = entities_and_components
                    .get_resource::<DeltaTime>()
                    .expect("Failed to get DeltaTime resource")
                    .get_delta_time() as f32;
    
                let physics_info = entities_and_components
                    .get_resource::<RapierPhysicsInfo>()
                    .expect("Failed to get PhysicsInfo resource");
    
                let input = entities_and_components.get_resource::<Input>().unwrap();
    
                if input.get_key_state(KeyCode::A) == KeyState::Held {
                    normalized_dir[0] -= 1.0;
                }
    
                if input.get_key_state(KeyCode::D) == KeyState::Held {
                    normalized_dir[0] += 1.0;
                }
    
                let intersection = physics_info.cast_ray(
                    &Ray::new(
                        vector![player_x as f32, player_y as f32 - 5.01].into(),
                        vector![0.0, -1.0],
                    ),
                    Real::MAX,
                    true,
                    QueryFilter::default(),
                );
    
                if input.get_key_state(KeyCode::Space) == KeyState::Pressed && intersection.is_some() {
                    let intersection = intersection.unwrap();
    
                    if intersection.1 < 0.01 {
                        normalized_dir[1] = 1.0;
                    }
                }
            }
    
            if let (Some(_), Some(_), Some(rigid_body)) = entities_and_components
                .try_get_components_mut::<(Player, Transform, RigidBody)>(player_entity)
            {
                rigid_body.apply_impulse(
                    vector![
                        normalized_dir[0] * self.speed * delta_time,
                        normalized_dir[1] * self.jump_force,
                    ],
                    true,
                );
            }
        }
    }



Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: