def __init__(self): sides = randint(5,9) vs = [vectors.to_cartesian((uniform(0.5,1.0), 2 * pi * i / sides)) for i in range(0,sides)] super().__init__(vs) self.vx = uniform(-1,1) self.vy = uniform(-1,1) self.angular_velocity = uniform(-pi/2,pi/2)
def main(asteroids=default_asteroids): pygame.init() screen = pygame.display.set_mode([width, height]) pygame.display.set_caption("Asteroids!") done = False clock = pygame.time.Clock() if trajectory_mode: screen.fill(WHITE) draw_grid(screen) since_last_trajectory_frame = trajectory_frame while not done: clock.tick() for event in pygame.event.get(): # User did something if event.type == pygame.QUIT: # If user clicked close done = True # Flag that we are done so we exit this loop # UPDATE THE GAME STATE milliseconds = clock.get_time() keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: ship.rotation_angle += milliseconds * (2 * pi / 1000) if keys[pygame.K_RIGHT]: ship.rotation_angle -= milliseconds * (2 * pi / 1000) for ast in asteroids: ast.move(milliseconds, (0, 0), gravity_sources=black_holes) for bh in black_holes: others = [other for other in black_holes if other != bh] bh.move(milliseconds, (0, 0), others) ship_thrust_vector = (0, 0) if keys[pygame.K_UP]: ship_thrust_vector = vectors.to_cartesian( (thrust, ship.rotation_angle)) elif keys[pygame.K_DOWN]: ship_thrust_vector = vectors.to_cartesian( (-thrust, ship.rotation_angle)) ship.move(milliseconds, ship_thrust_vector, black_holes) laser = ship.laser_segment() # DRAW THE SCENE if not trajectory_mode: screen.fill(WHITE) draw_grid(screen) if keys[pygame.K_SPACE]: draw_segment(screen, *laser) since_last_trajectory_frame += milliseconds if not trajectory_mode or since_last_trajectory_frame >= trajectory_frame: draw_poly(screen, ship) since_last_trajectory_frame = 0 for bh in black_holes: draw_poly(screen, bh, fill=True) for asteroid in asteroids: if keys[pygame.K_SPACE] and asteroid.does_intersect(laser): asteroids.remove(asteroid) else: draw_poly(screen, asteroid, color=GREEN) pygame.display.flip() pygame.quit()
def rotate2d(angle, vector): l, a = to_polar(vector) return to_cartesian((l, a+angle))
def __init__(self, gravity): vs = [ vectors.to_cartesian((0.5, 2 * pi * i / 20)) for i in range(0, 20) ] super().__init__(vs) self.gravity = gravity