pip install pygame pymunk numpy import pygame
import pymunk
import pymunk.pygame_util
import numpy as np
# Initialize Pygame & Pymunk
pygame.init()
screen = pygame.display.set_mode((800, 800))
clock = pygame.time.Clock()
space = pymunk.Space()
# Disable Pymunk's default gravity (we'll implement custom gravity)
space.gravity = (0, 0)
# Draw helper
draw_options = pymunk.pygame_util.DrawOptions(screen)
# Celestial body (e.g., a planet)
planet_mass = 100000
planet_radius = 50
planet_body = pymunk.Body(body_type=pymunk.Body.STATIC)
planet_body.position = (400, 400)
planet_shape = pymunk.Circle(planet_body, planet_radius)
planet_shape.density = 1
space.add(planet_body, planet_shape)
# Spacecraft (player-controlled)
ship_mass = 10
ship_radius = 10
ship_body = pymunk.Body(ship_mass, pymunk.moment_for_circle(ship_mass, 0, ship_radius))
ship_body.position = (400, 200) # Start above the planet
ship_shape = pymunk.Circle(ship_body, ship_radius)
ship_shape.density = 1
space.add(ship_body, ship_shape)
# Custom gravity function (Newtonian gravity)
def apply_gravity():
G = 1000 # Gravitational constant (tuned for gameplay)
planet_pos = np.array(planet_body.position)
ship_pos = np.array(ship_body.position)
r_vec = planet_pos - ship_pos
r = np.linalg.norm(r_vec)
if r > planet_radius + ship_radius:
force_magnitude = G * planet_mass * ship_mass / (r ** 2)
force_dir = r_vec / r
force = force_magnitude * force_dir
ship_body.apply_force_at_local_point(force, (0, 0))
# Game loop
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.KEYDOWN:
# Apply thrust (WASD controls)
if event.key == pygame.K_w:
ship_body.apply_impulse_at_local_point((0, -50)) # Up
elif event.key == pygame.K_s:
ship_body.apply_impulse_at_local_point((0, 50)) # Down
elif event.key == pygame.K_a:
ship_body.apply_impulse_at_local_point((-50, 0)) # Left
elif event.key == pygame.K_d:
ship_body.apply_impulse_at_local_point((50, 0)) # Right
# Apply custom gravity
apply_gravity()
# Update physics
space.step(1/60)
# Draw
screen.fill((0, 0, 0))
space.debug_draw(draw_options)
pygame.display.flip()
clock.tick(60)
pygame.quit(ship_body.velocity = (150, 0) # Circular orbit velocity)