2017-05-21 3 views
1

Ich habe seit einigen Tagen kämpfen versucht, herauszufinden, wie man zum Beispiel eine Bildbewegung in kreisförmigen Weg zu machen. Ich habe andere Beiträge hier gesucht, aber ich kann es einfach nicht bekommen.Pygame sin, cos, tan caculating kreisförmige Bewegungspfad

Also wie verschiebe ich Bild in kreisförmigen Pfad. Mein Code bewegt nur mein Bild um 45 Grad und stoppt dann. Ich würde es brauchen, um den Kreis zu schließen und weiterzumachen.

Aktuelle 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() 

Antwort

1

Sie können nur einen pygame.math.Vector2 verwenden und jeden Frame drehen, skalieren sie durch den Radius und fügen Sie ihn in die Position CENTER die aktuelle Zentrum des kleinen Kreises zu bekommen.

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: Wenn Sie die rote Kugel der Maus folgen wollen, dann wird Ihr Beispiel funktioniert eigentlich, wenn Sie x und y auf die Maus pos x, y = pygame.mouse.get_pos() eingestellt.

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() 
+0

Wenn Sie mit Vektoren nicht vertraut sind, gibt es einige gute Videos auf [khanacademy.org] (https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces). – skrx

+0

Auf Ihre ursprüngliche Antwort. Ist es möglich, die Geschwindigkeit zu ändern? – cmdtvt

+0

Sicher, ich wählte nur 4 Grad ('direction.rotate_ip (4)') pro Frame beliebig. – skrx