From 2c120106c28b362567e610da16449e9a84f8a2a7 Mon Sep 17 00:00:00 2001 From: Crizomb Date: Fri, 26 Dec 2025 13:12:09 +0100 Subject: [PATCH] movement + collision untested and unsued (but for real this time) --- src/collider.rs | 5 +++++ src/physics_body.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/sphere_collider.rs | 7 +++++++ 3 files changed, 50 insertions(+) create mode 100644 src/collider.rs create mode 100644 src/physics_body.rs create mode 100644 src/sphere_collider.rs diff --git a/src/collider.rs b/src/collider.rs new file mode 100644 index 0000000..dc307ed --- /dev/null +++ b/src/collider.rs @@ -0,0 +1,5 @@ +use bevy::{prelude::*, render::renderer}; + +#[derive(Component, Default)] +#[require(Transform)] +pub struct Collider; diff --git a/src/physics_body.rs b/src/physics_body.rs new file mode 100644 index 0000000..29c8984 --- /dev/null +++ b/src/physics_body.rs @@ -0,0 +1,38 @@ +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; + } +} diff --git a/src/sphere_collider.rs b/src/sphere_collider.rs new file mode 100644 index 0000000..bf28d84 --- /dev/null +++ b/src/sphere_collider.rs @@ -0,0 +1,7 @@ +use bevy::{prelude::*, render::renderer}; + +#[derive(Component, Default)] +#[require(Transform)] +pub struct SphereCollider { + pub radius: f32, +}