physme 0.2.4

A simple 2d and 3d physics engine for bevy
Documentation
use bevy::prelude::*;
use physme::prelude2d::*;

#[derive(Default)]
pub struct CharacterController;

fn main() {
    let mut builder = App::build();
    builder
        .add_default_plugins()
        .add_plugin(Physics2dPlugin)
        .add_resource(GlobalFriction(0.90))
        .add_startup_system(setup.system());
    let character_system = CharacterControllerSystem::default().system(builder.resources_mut());
    builder.add_system(character_system);
    builder.run();
}

fn setup(
    mut commands: Commands,
    asset_server: Res<AssetServer>,
    mut materials: ResMut<Assets<ColorMaterial>>,
) {
    let icon = asset_server.load("assets/icon.png").unwrap();
    let square = asset_server.load("assets/square.png").unwrap();
    commands
        .spawn(Camera2dComponents::default())
        .spawn(SpriteComponents {
            material: materials.add(icon.into()),
            ..Default::default()
        })
        .with(
            RigidBody::new(Mass::Real(1.0))
                .with_status(Status::Semikinematic)
                .with_position(Vec2::new(0.0, 0.0))
                .with_terminal(Vec2::new(500.0, 5000.0)),
        )
        .with(CharacterController::default())
        .with_children(|parent| {
            parent.spawn((Shape::from(Size::new(28.0, 28.0)),));
        })
        .spawn(SpriteComponents {
            material: materials.add(square.into()),
            ..Default::default()
        })
        .with(
            RigidBody::new(Mass::Real(1.0))
                .with_status(Status::Semikinematic)
                .with_position(Vec2::new(0.0, 60.0)),
        )
        .with_children(|parent| {
            parent.spawn((Shape::from(Size::new(20.0, 20.0)),));
        });
}

#[derive(Default)]
pub struct CharacterControllerSystem;

impl CharacterControllerSystem {
    pub fn system(self, res: &mut Resources) -> Box<dyn System> {
        let system = character_system.system();
        res.insert_local(system.id(), self);
        system
    }
}

fn character_system(
    _state: Local<CharacterControllerSystem>,
    input: Res<Input<KeyCode>>,
    mut query: Query<With<CharacterController, Mut<RigidBody>>>,
) {
    for mut body in &mut query.iter() {
        if input.pressed(KeyCode::Q) {
            body.rotation += 0.1;
        }
        if input.pressed(KeyCode::E) {
            body.rotation -= 0.1;
        }
        if input.pressed(KeyCode::W) {
            body.apply_impulse(Vec2::new(0.0, 5.0));
        }
        if input.pressed(KeyCode::S) {
            body.apply_impulse(Vec2::new(0.0, -5.0));
        }
        if input.pressed(KeyCode::A) {
            body.apply_impulse(Vec2::new(-5.0, 0.0));
        }
        if input.pressed(KeyCode::D) {
            body.apply_impulse(Vec2::new(5.0, 0.0));
        }
    }
}