Я пытаюсь имитировать в Python некоторое поведение, доступное в JS, с помощью команды context.rotate (angle).
У меня есть следующий код ниже:
импорт пигмей
импорт математики
импорт numpy как np
pygame.init()
CLOCK = pygame.time.Clock()
RED = pygame.color.THECOLORS['red']
WHITE = pygame.color.THECOLORS['white']
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
screen_width, screen_height = screen.get_size()
surface = pygame.Surface((50, 50), pygame.SRCALPHA)
surface.fill((0, 0, 0))
rotated_surface = surface
rect = surface.get_rect()
ax = int(screen_width / 2)
ay = int(screen_height / 2)
angle = 0
print("Size of the screen ({}, {})".format(screen_width, screen_height))
print("Center of the screen ({}, {})".format(ax, ay))
myfont = pygame.font.SysFont("monospace", 12)
pygame.display.set_caption("Test rotate")
main_loop = True
amplifier = 200
def calculate_angle(mouse_position):
dx = mouse_position[0] - ax
dy = mouse_position[1] - ay
return np.arctan2(dy,dx)
while main_loop:
for event in pygame.event.get():
keys = pygame.key.get_pressed()
if event.type == pygame.QUIT or keys[pygame.K_ESCAPE]:
main_loop = False
pos = pygame.mouse.get_pos()
angle = (calculate_angle(pos) * 180)/math.pi
screen.fill((255,255,255))
rotated_surface = pygame.transform.rotate(surface, -angle)
rect = rotated_surface.get_rect(center = (ax, ay))
screen.blit(rotated_surface, (rect.x, rect.y))
pygame.draw.line(rotated_surface, WHITE, (ax,ay), (ax+20, ay), 1)
pygame.draw.line(rotated_surface, WHITE, (ax+10,ay-10), (ax+20, ay), 1)
pygame.draw.line(rotated_surface, WHITE, (ax+10,ay+10), (ax+20, ay), 1)
pygame.display.update()
CLOCK.tick(30)
pygame.quit()
Я рисую стрелку и хочу повернуть ее в зависимости от того, где находится мышь на экране. Конечно, я могу каждый раз перерисовывать свои строки, выполняя вычисления синуса, косинуса, но это больно. Я думал, что поверхности могут помочь мне здесь, и на самом деле, это работает с прямоугольником, который отлично вращается. Но рисование моих линий на поверхности не работает.
Итак, я полагаю, что неправильно понимаю, для чего нужны поверхности, или, может быть, я что-то неправильно кодирую, и есть лучший способ сделать это. Обратите внимание, что если я заменим rotated_surface на screen в моих инструкциях draw.line, стрелка будет нарисована на экране, но никогда не будет вращаться.
Есть мысли (помимо использования изображения / спрайта;))?
Спасибо