Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Improved. Instead of using angle. I use a rotation vector.
- import pygame
- TRANSPARENT = 0, 0, 0, 0
- ORBIT_SPEED = 3000
- def get_angle_vector(distance=1, angle=0):
- vector = pygame.Vector2()
- vector.from_polar((distance, angle))
- return vector
- def create_circle(size, color):
- rect = pygame.Rect((0, 0), size)
- surface = pygame.Surface(size, pygame.SRCALPHA)
- surface.fill(TRANSPARENT)
- radius = min((rect.centerx, rect.centery))
- pygame.draw.circle(surface, color, rect.center, radius)
- return surface
- class OrbitObject(pygame.sprite.Sprite):
- def __init__(self, image, position, distance):
- super().__init__()
- self.image = image
- self.rect = image.get_rect()
- self.orbit_point = position
- self.rotation_vector = get_angle_vector(distance, 0)
- self.speed = ORBIT_SPEED / distance
- self.rect.center = self.rotation_vector + self.orbit_point
- def update(self, delta):
- self.rotation_vector.rotate_ip(self.speed * delta)
- self.rect.center = self.rotation_vector + self.orbit_point
- def main(caption, width, height, flags=0, fps=60):
- # Simple Pygame Setup
- pygame.display.set_caption(caption)
- surface = pygame.display.set_mode((width, height), flags)
- rect = surface.get_rect()
- clock = pygame.time.Clock()
- running = True
- delta = 0
- fps = fps
- # Variables
- background_color = 'black'
- images = []
- images.append(create_circle((10, 40), 'lawngreen'))
- images.append(create_circle((20, 40), 'dodgerblue'))
- images.append(create_circle((40, 40), 'violet'))
- sprites = pygame.sprite.Group(OrbitObject(images[0], rect.center, 20),
- OrbitObject(images[1], rect.center, 50),
- OrbitObject(images[2], rect.center, 150))
- # Main Loop
- while running:
- for event in pygame.event.get():
- if event.type == pygame.MOUSEBUTTONDOWN:
- if event.button == 1:
- for sprite in sprites:
- sprite.orbit_point = event.pos
- elif event.button == 3:
- for sprite in sprites:
- sprite.orbit_point = rect.center
- elif event.type == pygame.QUIT:
- running = False
- # Logic
- sprites.update(delta)
- # Draw
- surface.fill(background_color)
- sprites.draw(surface)
- # Render Buffer To Screen
- pygame.display.flip()
- # Idle And Get Delta Time
- delta = clock.tick(fps) / 1000
- pygame.init()
- main('Orbit with vectors', 800, 600)
- pygame.quit()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement