use bevy::{prelude::*, render::renderer}; #[derive(Component)] #[require(Transform)] pub struct PhysicsBody { pub mass: f32, pub force: Vec2, pub velocity: Vec2, pub drag: f32, // velocity multiplied each physics update by (1-drag) } impl Default for PhysicsBody { fn default() -> Self { Self { mass: 1.0, force: Vec2::ZERO, velocity: Vec2::ZERO, drag: 0.0, } } } pub fn integrate(mut query: Query<(&mut Transform, &mut PhysicsBody)>, time: Res>) { for (mut transform, mut physicsbody) in &mut query { let force = physicsbody.force; let mass = physicsbody.mass; let drag = physicsbody.drag; let delta_secs = time.delta_secs(); physicsbody.velocity += force * delta_secs / mass; // Drag because stability is good you know physicsbody.velocity *= 1.0 - drag; transform.translation.x += physicsbody.velocity.x * delta_secs; transform.translation.y += physicsbody.velocity.y * delta_secs; physicsbody.force = Vec2::ZERO; } }