cmdtvt
cmdtvt

Reputation: 71

Pygame sin,cos,tan caculating circular movement path

I have been struggling for few days know trying to figure out how to make for example a image move in circular path. I have looked other posts here but i just can't get it.

So how do i move image in circular path. My code only moves my image 45 degrees and stops then. I would need it to go full circle and continue doing it.

Current Code:

import pygame

pygame.init()
screen = pygame.display.set_mode((400, 400))

CENTER = (200, 200)
RADIUS = 100
x = 0
y = 0

satelliteCenter = (CENTER[0]+RADIUS, CENTER[1])

run = 1
while run == 1:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      run = 0
      pygame.quit()

  mouse = pygame.mouse.get_pos()
  vector = x-CENTER[0], y-CENTER[1]
  x +=1

  distance = (vector[0]**2 + vector[1]**2)**0.5

  if distance > 0:
    scalar = RADIUS / distance
    satelliteCenter = (
      int(round( CENTER[0] + vector[0]*scalar )),
      int(round( CENTER[1] + vector[1]*scalar )) )

  screen.fill((255,255,255))
  pygame.draw.circle(screen, (71,153,192), CENTER, RADIUS)
  pygame.draw.circle(screen, (243,79,79), satelliteCenter, 16)
  pygame.display.update()

Upvotes: 1

Views: 479

Answers (1)

skrx
skrx

Reputation: 20438

You can just use a pygame.math.Vector2 and rotate it each frame, scale it by the radius and add it to the CENTER position to get the current center of the small circle.

import sys
import pygame

pygame.init()
screen = pygame.display.set_mode((400, 400))
clock = pygame.time.Clock()

CENTER = (200, 200)
RADIUS = 100
# A unit vector pointing to the right.
direction = pygame.math.Vector2(1, 0)

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            sys.exit()

    direction.rotate_ip(4)  # By 4 degrees.
    # Normalize it, so that the length doesn't change because
    # of floating point inaccuracies.
    direction.normalize_ip()
    # Scale direction vector, add it to CENTER and convert to ints.
    ball_pos = [int(i) for i in CENTER+direction*RADIUS]

    screen.fill((255,255,255))
    pygame.draw.circle(screen, (71,153,192), CENTER, RADIUS)
    pygame.draw.circle(screen, (243,79,79), ball_pos, 16)
    pygame.display.update()
    clock.tick(30)

Edit: If you want the red ball to follow the mouse, then your example actually works if you set x and y to the mouse pos x, y = pygame.mouse.get_pos().

import sys
import pygame

pygame.init()
screen = pygame.display.set_mode((400, 400))

CENTER = (200, 200)
RADIUS = 100
x = 0
y = 0

satelliteCenter = (CENTER[0]+RADIUS, CENTER[1])

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
            sys.exit()

    x, y = pygame.mouse.get_pos()
    vector = x-CENTER[0], y-CENTER[1]

    distance = (vector[0]**2 + vector[1]**2)**0.5

    if distance > 0:
        scalar = RADIUS / distance
        satelliteCenter = (
            int(round( CENTER[0] + vector[0]*scalar )),
            int(round( CENTER[1] + vector[1]*scalar ))
        )

    screen.fill((255,255,255))
    pygame.draw.circle(screen, (71,153,192), CENTER, RADIUS)
    pygame.draw.circle(screen, (243,79,79), satelliteCenter, 16)
    pygame.display.update()

Upvotes: 1

Related Questions