use shadow_engine_2d::prelude::*;
use winit::keyboard::KeyCode;
fn main() {
env_logger::init();
let mut engine = Engine::builder()
.title("Shadow Engine 2D - Physics Demo")
.size(1280, 720)
.build();
let physics = PhysicsSystem::new();
let player = engine.world_mut().spawn();
if let Some(entity) = engine.world_mut().entity_mut(player) {
entity.add(Transform::new(0.0, -200.0));
entity.add(Sprite::new(50.0, 50.0).with_color(Color::CYAN));
entity.add(RigidBody::dynamic().with_drag(0.5));
entity.add(Collider::box_collider(50.0, 50.0));
}
let platforms = vec![
(-400.0, 250.0, 200.0, 30.0),
(-100.0, 150.0, 200.0, 30.0),
(200.0, 50.0, 200.0, 30.0),
(-200.0, -50.0, 600.0, 30.0),
];
for (x, y, w, h) in platforms {
let platform = engine.world_mut().spawn();
if let Some(entity) = engine.world_mut().entity_mut(platform) {
entity.add(Transform::new(x, y));
entity.add(Sprite::new(w, h).with_color(Color::GREEN));
entity.add(Collider::box_collider(w, h));
}
}
for i in 0..3 {
let box_entity = engine.world_mut().spawn();
if let Some(entity) = engine.world_mut().entity_mut(box_entity) {
entity.add(Transform::new(-300.0 + i as f32 * 100.0, -300.0));
entity.add(Sprite::new(40.0, 40.0).with_color(Color::RED));
entity.add(RigidBody::dynamic().with_mass(2.0).with_drag(0.3));
entity.add(Collider::box_collider(40.0, 40.0));
}
}
let walls = vec![
(-640.0, 0.0, 20.0, 720.0), (640.0, 0.0, 20.0, 720.0), (0.0, 360.0, 1280.0, 20.0), ];
for (x, y, w, h) in walls {
let wall = engine.world_mut().spawn();
if let Some(entity) = engine.world_mut().entity_mut(wall) {
entity.add(Transform::new(x, y));
entity.add(Sprite::new(w, h).with_color(Color::rgb(0.3, 0.3, 0.3)));
entity.add(Collider::box_collider(w, h));
}
}
engine.run(move |world, input, time| {
let dt = time.delta();
let move_force = 5000.0;
let jump_impulse = 400.0;
for entity in world.entities_mut() {
if let Some(sprite) = entity.get::<Sprite>() {
if sprite.color.b > 0.9 && sprite.color.r < 0.1 { if let Some(body) = entity.get_mut::<RigidBody>() {
if input.key_pressed(KeyCode::KeyA) || input.key_pressed(KeyCode::ArrowLeft) {
body.apply_force(Vec2::new(-move_force, 0.0));
}
if input.key_pressed(KeyCode::KeyD) || input.key_pressed(KeyCode::ArrowRight) {
body.apply_force(Vec2::new(move_force, 0.0));
}
if input.key_just_pressed(KeyCode::Space) || input.key_just_pressed(KeyCode::KeyW) {
body.apply_impulse(Vec2::new(0.0, -jump_impulse));
}
}
}
}
}
physics.update(world, dt);
let collisions = physics.detect_collisions(world);
physics.resolve_collisions(world, &collisions);
});
}