Почему не крутится по кругу? А как исправить? - PullRequest
2 голосов
/ 13 июля 2020

Я не уверен, как называется создаваемая форма, но я думаю, что это комбинация круга и квадрата или, возможно, похожа на цилиндр. Вы можете запустить код, чтобы увидеть, какую форму он принимает. И не могли бы вы предложить сайт, на котором я могу научиться программировать игру (алгоритмы, лежащие в основе базовых c игр)? Надеюсь, вы понимаете, что я имею в виду, потому что я не очень хорошо владею английским sh.

import pygame
import sys
import math

pygame.init()

width = 640
height = 480
screen = pygame.display.set_mode((width,height))

img = pygame.Surface((50,50))
img.set_colorkey((255,0,0))

angle = 0
clock = pygame.time.Clock()

c_list = []

x = 100
y = 100

vel = 5

def draw_line(surface, color, pos1, pos2):
    pygame.draw.line(surface, color, pos1, pos2)

while True:
    screen.fill((122,122,122))
    keys = pygame.key.get_pressed()
    angle -= 3
    if angle % 360 < 90:
        x -= math.sin(angle/180*math.pi)**2*vel
        y -= math.cos(angle/180*math.pi)**2*vel
    elif angle % 360 < 180:
        x -= math.sin(angle/180*math.pi)**2*vel
        y += math.cos(angle/180*math.pi)**2*vel
    elif angle % 360 < 270:
        x += math.sin(angle/180*math.pi)**2*vel
        y += math.cos(angle/180*math.pi)**2*vel
    else:
        x += math.sin(angle/180*math.pi)**2*vel
        y -= math.cos(angle/180*math.pi)**2*vel

    if (x,y) not in c_list:
        c_list.append((x,y))
    for i in range(len(c_list)-1):
        draw_line(screen,(0,0,0),c_list[i],c_list[i+1])
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit(-1)

    img_copy = pygame.transform.rotate(img, angle)
    screen.blit(img_copy,(x-int(img_copy.get_width()/2),y-int(img_copy.get_width()/2)))

    pygame.display.flip()

1 Ответ

2 голосов
/ 13 июля 2020

Вы должны найти касательную к окружности. Если у вас есть angle, тогда вектор к точке на окружности будет:

vx, vy = cos(angle), sin(angle)

Касательной к окружности будет вектор, повернутый на 90 °:

tx, ty = -vy, vy

Добавить тангенс, умноженный на скорость до точки (x, y) в каждом кадре:

x -= math.sin(angle*math.pi/180)*vel
y += math.cos(angle*math.pi/180)*vel 
angle += 3

См. пример:

import pygame
import sys
import math

pygame.init()
width = 640
height = 480
screen = pygame.display.set_mode((width,height))
clock = pygame.time.Clock()

img = pygame.Surface((50,50))
img.set_colorkey((255,0,0))
angle = 0
c_list = []
x, y = 300, 200
vel = 5

def draw_line(surface, color, pos1, pos2):
    pygame.draw.line(surface, color, pos1, pos2)

start = False
while True:
    screen.fill((122,122,122))
    keys = pygame.key.get_pressed()
    
    x -= math.sin(angle*math.pi/180)*vel
    y += math.cos(angle*math.pi/180)*vel 
    angle += 3

    if (x,y) not in c_list:
        c_list.append((x,y))
    for i in range(len(c_list)-1):
        draw_line(screen,(0,0,0),c_list[i],c_list[i+1])
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit(-1)

    img_copy = pygame.transform.rotate(img, -angle)
    screen.blit(img_copy,(x-int(img_copy.get_width()/2),y-int(img_copy.get_width()/2)))
    pygame.display.flip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...