Advertisement
Windspar

Simple Example Orbiting With Vector2

Mar 26th, 2024 (edited)
655
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.66 KB | None | 0 0
  1. # Improved. Instead of using angle. I use a rotation vector.
  2. import pygame
  3.  
  4. TRANSPARENT = 0, 0, 0, 0
  5. ORBIT_SPEED = 3000
  6.  
  7. def get_angle_vector(distance=1, angle=0):
  8.     vector = pygame.Vector2()
  9.     vector.from_polar((distance, angle))
  10.     return vector
  11.  
  12. def create_circle(size, color):
  13.     rect = pygame.Rect((0, 0), size)
  14.     surface = pygame.Surface(size, pygame.SRCALPHA)
  15.     surface.fill(TRANSPARENT)
  16.     radius = min((rect.centerx, rect.centery))
  17.     pygame.draw.circle(surface, color, rect.center, radius)
  18.     return surface
  19.  
  20. class OrbitObject(pygame.sprite.Sprite):
  21.     def __init__(self, image, position, distance):
  22.         super().__init__()
  23.         self.image = image
  24.         self.rect = image.get_rect()
  25.         self.orbit_point = position
  26.         self.rotation_vector = get_angle_vector(distance, 0)
  27.         self.speed = ORBIT_SPEED / distance
  28.         self.rect.center = self.rotation_vector + self.orbit_point
  29.  
  30.     def update(self, delta):
  31.         self.rotation_vector.rotate_ip(self.speed * delta)
  32.         self.rect.center = self.rotation_vector + self.orbit_point
  33.  
  34. def main(caption, width, height, flags=0, fps=60):
  35.     # Simple Pygame Setup
  36.     pygame.display.set_caption(caption)
  37.     surface = pygame.display.set_mode((width, height), flags)
  38.     rect = surface.get_rect()
  39.     clock = pygame.time.Clock()
  40.     running = True
  41.     delta = 0
  42.     fps = fps
  43.  
  44.     # Variables
  45.     background_color = 'black'
  46.     images = []
  47.     images.append(create_circle((10, 40), 'lawngreen'))
  48.     images.append(create_circle((20, 40), 'dodgerblue'))
  49.     images.append(create_circle((40, 40), 'violet'))
  50.  
  51.     sprites = pygame.sprite.Group(OrbitObject(images[0], rect.center, 20),
  52.                                   OrbitObject(images[1], rect.center, 50),
  53.                                   OrbitObject(images[2], rect.center, 150))
  54.  
  55.     # Main Loop
  56.     while running:
  57.         for event in pygame.event.get():
  58.             if event.type == pygame.MOUSEBUTTONDOWN:
  59.                 if event.button == 1:
  60.                     for sprite in sprites:
  61.                         sprite.orbit_point = event.pos
  62.                 elif event.button == 3:
  63.                     for sprite in sprites:
  64.                         sprite.orbit_point = rect.center
  65.             elif event.type == pygame.QUIT:
  66.                 running = False
  67.  
  68.         # Logic
  69.         sprites.update(delta)
  70.  
  71.         # Draw
  72.         surface.fill(background_color)
  73.         sprites.draw(surface)
  74.  
  75.         # Render Buffer To Screen
  76.         pygame.display.flip()
  77.         # Idle And Get Delta Time
  78.         delta = clock.tick(fps) / 1000
  79.  
  80. pygame.init()
  81. main('Orbit with vectors', 800, 600)
  82. pygame.quit()
  83.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement