1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
use core::f32;
use bevy::prelude::*;
use avian2d::prelude::*;
use crate::StartPlanet;
use crate::Stickable;
use crate::TouchdownGoal;
use super::DestPlanet;
use super::LunarOrbitalData;
pub fn lunar_period_to_vec(angular_pos: f32, radius: f32) -> Vec2 {
let x = radius * f32::cos(angular_pos);
let y = radius * f32::sin(angular_pos);
Vec2 { x, y }
}
pub fn update_lunar_transform(
time: Res<Time>,
goal: Res<TouchdownGoal>,
mut lunar_query: Query<(
&DestPlanet,
&mut LunarOrbitalData,
&mut Transform,
&mut LinearVelocity,
&RigidBody
), (With<DestPlanet>, Without<StartPlanet>)>,
mut solar_query: Query<(
&Transform
), (With<StartPlanet>, Without<DestPlanet>)>,
) {
if goal.reached {return;}
let (_moon_planet, mut lod, mut moon_transform, mut moon_vel, _moon_body) = lunar_query.single_mut();
let (solar_transform) = solar_query.single_mut();
let dt = time.delta_secs();
let new_transform = lunar_period_to_vec(
lod.period,
lod.orbital_radius).normalize_or_zero() * lod.orbital_radius;
// moon_transform.translation = Vec3 {x: new_transform.x, y: new_transform.y, z: 0.0};
moon_vel.0 = (new_transform - moon_transform.translation.xy() + solar_transform.translation.xy()) * 100.0 * dt;
println!("lunar transform: {}", moon_transform.translation);
lod.period += dt * lod.orbital_velocity;
lod.period = if lod.period <= 2. * f32::consts::PI { lod.period } else { 0. }
}
pub fn setup_moon(mut cmd: Commands) {
let objective_planet = DestPlanet {
// display_name: String::from("Objective Planet"),
planet_mass_kg: 50000.0,
radius: 30.0,
};
let lunar_radius = 300.0;
let r = (&objective_planet).radius;
let m = (&objective_planet).planet_mass_kg;
let initial_transform = lunar_period_to_vec(0., 100.);
cmd.spawn((
objective_planet,
LunarOrbitalData { period: 0., orbital_velocity: 1.0, orbital_radius: lunar_radius},
RigidBody::Dynamic,
Transform::from_xyz(initial_transform.x, initial_transform.y, 0.0),
LockedAxes::ROTATION_LOCKED,
LinearVelocity::ZERO,
Stickable {},
Sprite::from_color(Color::BLACK, Vec2 { x: 30., y: 30. }),
Collider::rectangle(r, r),
Mass(m),
));
}
|