@@ 14,6 14,7 @@ pub mod macros;
const SCALE: f32 = 10.0;
const EARTH_SIZE: f32 = 1000.0;
+const GRAVITY: f32 = 0.02;
fn main() {
let subscriber = tracing_subscriber::FmtSubscriber::new();
@@ 33,10 34,10 @@ fn main() {
.add_plugins(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(SCALE))
.add_plugins(TwiteServerPlugin)
.add_systems(Startup, spawn_planets)
- //.add_systems(Update, on_connection)
.add_systems(Update, on_message)
.add_systems(Update, on_close)
.add_systems(FixedUpdate, on_position_change)
+ .add_systems(FixedUpdate, do_gravity)
.run();
info!("Goodbye!");
@@ 51,6 52,8 @@ fn spawn_planets(mut commands: Commands) {
transform: TransformBundle::from(earth_pos),
})
.insert(Collider::ball(EARTH_SIZE / SCALE))
+ .insert(AdditionalMassProperties::Mass(10000.0))
+ .insert(ReadMassProperties::default())
.insert(RigidBody::Fixed);
}
@@ 91,6 94,9 @@ fn on_message(
player: Player { addr: *addr, username: username.to_string() },
})
.insert(Collider::cuboid(25.0 / SCALE, 25.0 / SCALE))
+ .insert(AdditionalMassProperties::Mass(10.0))
+ .insert(ExternalImpulse { impulse: Vec2::ZERO, torque_impulse: 0. })
+ .insert(ReadMassProperties::default())
.insert(RigidBody::Dynamic)
.id().index();
@@ 228,3 234,24 @@ fn on_position_change(
packet_send.send(ServerEvent::Broadcast(MessageType::Text, buf));
}
}
+
+fn do_gravity(
+ mut part_query: Query<(&Transform, &ReadMassProperties, &mut ExternalImpulse), With<PartType>>,
+ planet_query: Query<(&Transform, &ReadMassProperties), With<PlanetType>>,
+) {
+ for (part_transform, part_mp, mut impulses) in &mut part_query {
+ impulses.impulse = Vec2::ZERO;
+ let part_mp = part_mp.get();
+ let part_mass = part_mp.mass;
+ let part_translate = part_transform.translation;
+ for (planet_transform, planet_mp) in &planet_query {
+ let planet_mp = planet_mp.get();
+ let planet_mass = planet_mp.mass;
+ let planet_translate = planet_transform.translation;
+ let distance = planet_translate.distance(part_translate);
+ let force = GRAVITY * ((part_mass * planet_mass) / (distance * distance));
+ let direction = (planet_translate - part_translate).normalize() * force;
+ impulses.impulse += direction.xy();
+ }
+ }
+}