All checks were successful
Build Bevy Game (Linux) / build (push) Successful in 18m45s
38 lines
1.1 KiB
Rust
38 lines
1.1 KiB
Rust
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<Time<Fixed>>) {
|
|
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;
|
|
}
|
|
}
|