diff options
Diffstat (limited to 'main.py')
-rw-r--r-- | main.py | 104 |
1 files changed, 78 insertions, 26 deletions
diff --git a/main.py b/main.py index 65bdf1d..f94780a 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ from random import randint from engine import Engine from fuel import Fuel +from stage import Stage from rocket import Rocket from atmosphere import Atmosphere from body import Body @@ -14,14 +15,33 @@ import pygame from pygame.locals import * def main(argv): - rocket = Rocket(name="starship", - rocket_mass=240000, #thrust=245000 - engine=Engine(name="raptor", thrust=2.3E6, flow_rate=1000), #https://en.wikipedia.org/wiki/SpaceX_Raptor - engine_number=33, - fuel_type=Fuel(name="methane", energy_density=None), - fuel_mass=4000000, - drag_coefficient=1.18, - cross_sectional_area=(math.pi * (9**2)) + #add engine mass + raptor_engine = Engine(name="raptor", isp=360, max_flow_rate=9000) #https://en.wikipedia.org/wiki/SpaceX_Raptor + methane_fuel = Fuel(name="methane", energy_density=None) #TODO: density + + #https://en.wikipedia.org/wiki/SpaceX_Starship + first_stage = Stage(name="superheavy booster", + stage_mass=180000, + engine=raptor_engine, + engine_number=33, + fuel_type=methane_fuel, + fuel_mass=3600000, + drag_coefficient=1.18, + cross_sectional_area=(math.pi * (9**2)) + ) + + second_stage = Stage(name="starship", + stage_mass=80000, + engine=raptor_engine, + engine_number=6, + fuel_type=methane_fuel, + fuel_mass=1200000, + drag_coefficient=1.18, + cross_sectional_area=(math.pi * (9**2)) + ) + + rocket = Rocket(name="starship launch system", + stages=[first_stage, second_stage] ) body = Body(name="earth", @@ -40,6 +60,7 @@ def main(argv): ) simulation = Simulation(universe, body, rocket) + simulation.rocket.current_stage().engines_on = True pygame.init() pygame.display.set_caption("OSLS - Overly Simple Launch Simulator") @@ -49,9 +70,11 @@ def main(argv): SCREEN_HEIGHT = 720 simulation_display = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) - while(True): - draw_simulation(simulation_display, simulation) - pygame.display.update() + paused = False + while True: + if not paused: + draw_simulation(simulation_display, simulation) + pygame.display.update() for event in pygame.event.get(): if event.type == pygame.QUIT: @@ -60,15 +83,18 @@ def main(argv): elif event.type == pygame.KEYDOWN: if event.key == pygame.K_q: quit() + elif event.key == pygame.K_SPACE: + paused = not paused else: handle_key_press(simulation, event.key) delta = clock.tick(60) / 1000 #60fps #are we using delta in the simulation tick everywhere needed? - print("delta: " + str(delta)) - simulation.tick(delta=delta) + if not paused: #tick with pause messes up delta TODO: TODOODODODODODOOD TODO + print("delta: " + str(delta)) + simulation.tick(delta=delta) - #TODO: draw floor, flame - #TODO: add support for rocket stages + #TODO: support rocket engine mass + #TODO: draw floor, flame (continuity) #TODO: do max load on rocket so it blows up #TODO: allow for x movement, speed, accel etc #TODO: allow multilanguage api for landing algorithms etc @@ -101,15 +127,20 @@ def draw_simulation(simulation_display: type[pygame.Surface], simulation: type[S #draw stats text font = pygame.font.SysFont("Comic Sans MS", 30) - simulation_display.blit(font.render("Time: {:.0f}s".format(simulation.time), False, (255, 255, 255)),(0,0)) + simulation_display.blit(font.render("Simulation time: {:.0f}s".format(simulation.time), False, (255, 255, 255)),(0,0)) simulation_display.blit(font.render("Altitude: {:.0f}m".format(simulation.y), False, (255, 255, 255)),(0,40)) simulation_display.blit(font.render("Speed: {:.0f}m/s".format(simulation.speed_y), False, (255, 255, 255)),(0,80)) simulation_display.blit(font.render("Acceleration: {:.2f}m/s2".format(simulation.acceleration_y), False, (255, 255, 255)),(0,120)) - simulation_display.blit(font.render("Fuel: {:.0f}kg".format(simulation.rocket.fuel_mass), False, (255, 255, 255)),(0,160)) + simulation_display.blit(font.render("Thrust: {:.0f}N".format(simulation.rocket.current_stage().current_thrust()), False, (255, 255, 255)),(0,160)) + simulation_display.blit(font.render("Fuel in stage: {:.0f}kg".format(simulation.rocket.current_stage().fuel_mass), False, (255, 255, 255)),(0,200)) + simulation_display.blit(font.render("Stage mass: {:.0f}kg".format(simulation.rocket.current_stage().total_mass()), False, (255, 255, 255)),(0,240)) + simulation_display.blit(font.render("Rocket mass: {:.0f}kg".format(simulation.rocket.total_mass()), False, (255, 255, 255)),(0,280)) + simulation_display.blit(font.render("Stage number: {:.0f}".format(simulation.rocket.stages_spent), False, (255, 255, 255)),(0,320)) + simulation_display.blit(font.render("Throttle: {:.0f}%".format(simulation.rocket.current_stage().throttle), False, (255, 255, 255)),(0,360)) #draw rocket - rocket_height = 90 - rocket_width = 60 + first_stage_height = 90 #TODO + first_stage_width = 60 def calculate_rocket_y_based_on_y_speed_accel(display_height: int, rocket_height: int, speed_y: float, accel_y: float) -> int: top = display_height / 5 - (rocket_height / 2) #in the case we are accelerating positively @@ -120,21 +151,42 @@ def draw_simulation(simulation_display: type[pygame.Surface], simulation: type[S def calculate_rocket_x_based_on_x_speed_accel(display_width: int, rocket_width: int, speed_x: float, accel_x: float) -> int: return display_width / 2 - (rocket_width / 2) - rocket_x = calculate_rocket_x_based_on_x_speed_accel(simulation_display.get_width(), rocket_width, None, None) - rocket_y = calculate_rocket_y_based_on_y_speed_accel(simulation_display.get_height(), rocket_height, simulation.speed_y, simulation.acceleration_y) + rocket_x = calculate_rocket_x_based_on_x_speed_accel(simulation_display.get_width(), first_stage_width, None, None) + rocket_y = calculate_rocket_y_based_on_y_speed_accel(simulation_display.get_height(), first_stage_height, simulation.speed_y, simulation.acceleration_y) rocket_color = (244, 67, 54) flame_radius = 10 flame_color = (255, 125, 100) - pygame.draw.rect(simulation_display, rocket_color, pygame.Rect(rocket_x, rocket_y, rocket_width, rocket_height)) - if simulation.rocket.engines_on and simulation.rocket.fuel_mass > 0: - pygame.draw.circle(simulation_display, flame_color, (rocket_x + (rocket_width / 2), rocket_y + rocket_height + flame_radius), flame_radius) + i = simulation.rocket.stages_spent + stage_height = first_stage_height / (i + 1) + stage_y = rocket_y + first_stage_height - stage_height + for _ in simulation.rocket.stages: + stage_width = first_stage_width / (i + 1) + stage_x = rocket_x + i * (stage_width / 2) + pygame.draw.rect(simulation_display, rocket_color, pygame.Rect(stage_x, stage_y, stage_width, stage_height)) + stage_y -= stage_height / 2 + stage_height /= 2 + i += 1 + + #draw flame + if simulation.rocket.current_stage().engines_on and simulation.rocket.current_stage().fuel_mass > 0: + pygame.draw.circle(simulation_display, flame_color, (rocket_x + (first_stage_width / 2), rocket_y + first_stage_height + flame_radius), flame_radius) def handle_key_press(simulation, key): - if key == pygame.K_SPACE: - simulation.rocket.engines_on = not simulation.rocket.engines_on + if key == pygame.K_x: + simulation.rocket.current_stage().engines_on = not simulation.rocket.current_stage().engines_on + elif key == pygame.K_z: + simulation.rocket.perform_stage_separation(True) + elif key == pygame.K_DOWN: + current_stage = simulation.rocket.current_stage() + if current_stage.throttle > 0: + current_stage.throttle -= 1 + elif key == pygame.K_UP: + current_stage = simulation.rocket.current_stage() + if current_stage.throttle < 100: + current_stage.throttle += 1 elif key == pygame.K_LEFT: sys.exit(0) elif key == pygame.K_RIGHT: |