summaryrefslogtreecommitdiff
path: root/src/main.rs
blob: 5e821f9f791798a582d9601776ce97d91c90d331 (plain)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
mod lunar;
mod setup;
mod controllable;

use avian2d::prelude::*;
use bevy::{prelude::*, winit::WinitSettings};
use controllable::Player;
use lunar::DestPlanet;
fn main() {
    println!("Hello, world!");
    App::new()
        .add_plugins(DefaultPlugins)
        .insert_resource(ClearColor(Color::srgb(0.5, 0.5, 0.9)))
        .insert_resource(WinitSettings::game())
        .add_plugins(PhysicsPlugins::default())
        .add_systems(
            Startup,
            (
                setup::setup_starting_planet, 
                setup::setup_init,
                controllable::setup_player_with_controls,
                lunar::setup_moon
            )
        )
        .add_systems(
            Update, 
            (
                lunar::update_lunar_transform,
                controllable::player_movements,
                controllable::camera_follow_player,
                controllable::check_transition_level,
                update_gravitational_forces,
            )
        )
        .run();
}

/*enum GameLevel {
    NearGround,
    Space,
    Moon,
    LunarSurface,
}*/
#[derive(Component)]
struct StartPlanet {
    display_name: String,
    planet_mass_kg: f32,
    radius: f32,
}

fn calculate_force_vector(
    mass_actor: f32,
    mass_incident: f32,
    pos_actor: Vec2,
    pos_incident: Vec2,
) -> Vec2 {
    let grav_const = 15.0;
    (grav_const * mass_actor * mass_incident / (pos_actor.distance_squared(pos_incident)))
        * Vec2 {
            x: pos_actor.x - pos_incident.x,
            y: pos_actor.y - pos_incident.y,
        }
        .normalize()
    /*Vec2 {
        x: pos_actor.x - pos_incident.x,
        y: pos_actor.y - pos_incident.y,
    }.normalize() *  50000.0*/
}
fn update_gravitational_forces(
    mut query_planet: Query<(Entity, &StartPlanet, &Transform)>,
    mut query_planet2: Query<(Entity, &DestPlanet, &Transform)>,
    mut query_object: Query<(Entity, &Player, &mut ExternalForce, &Transform)>,
) {
    let (_es, ps, ts) = query_planet.single_mut();
    let (_es, planet2, trans2) = query_planet2.single_mut();
    let (_ed, player, mut exd, td) = query_object.single_mut();
    let f0 = calculate_force_vector(
        ps.planet_mass_kg,
        player.mass_kg,
        ts.translation.xy(),
        td.translation.xy(),
    );
    let f1 = calculate_force_vector(
        planet2.planet_mass_kg, 
        player.mass_kg, 
        trans2.translation.xy(), 
        td.translation.xy());
    //info!("Force: {}, Transform: {}", f, td.translation);
    exd.apply_force(f0).apply_force(f1);
}