2017-05-21 3 views
1

私は数日間苦労して、例えば円形の経路で画像を動かす方法を見つけようとしています。私はここに他の記事を見ているが、私はそれを得ることができない。Pygame sin、cos、tan caculating circular movement path

どのようにして画像を円形経路で移動しますか?私のコードは画像を45度だけ動かして停止します。私はそれが完全な円になり、それを続けている必要があります。

現在のコード:

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

答えて

1

は、あなただけのpygame.math.Vector2を使用し、それを各フレームを回転させ、半径によってそれを拡張し、小さな円の現在の中心を取得するためにCENTER位置に追加することができます。

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) 

編集:あなたは赤いボールがマウスをフォローしたい場合は、マウスのPOS x, y = pygame.mouse.get_pos()にxとyを設定した場合、その後、あなたの例では、実際に動作します。

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

あなたはベクトルに慣れていない場合は、[khanacademy.org](https://www.khanacademy.org/math/linear-algebra/vectors-and-spaces)にいくつかの良いビデオがあります。 – skrx

+0

元の回答です。速度を変えることは可能ですか? – cmdtvt

+0

もちろん、フレームごとに4度( 'direction.rotate_ip(4)')を任意に選択しました。 – skrx

関連する問題