Pygame - одновременно вращать спрайт и следовать по пути [дубликат]

avatar
Alex Foster
24 мая 2019 в 18:16
240
1
2

Я пытаюсь анимировать брошенный мяч и хочу, чтобы он одновременно вращался и следовал по плавной параболической траектории. Однако я никак не могу заставить pygame.transform.rotate() сотрудничать.

Вот что я уже пробовал:

import pygame
screen = pygame.display.set_mode((500, 500))
timer = pygame.time.Clock()
ball = pygame.sprite.Sprite()
ball.image = pygame.image.load("throwball.png")
ball.image = pygame.transform.scale(ball.image, (48,48))
ball.rect = ball.image.get_rect(topleft = (50,50))
ball.orig_image = ball.image
rotaterect = ball.rect

for i in range(60):
    #pygame.draw.rect(screen, Color(255,255,255), ball.rect)
    ball.image = pygame.transform.rotate(ball.orig_image, i*20)
    rotaterect.topleft = (5*i,((i-20)*(i-20) + 1)/5)
    ball.rect.center = rotaterect.center
    screen.blit(ball.image, ball.rect)
    pygame.display.update()
    timer.tick(60)
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
while 1:
    for e in pygame.event.get():
        if e.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

Каждый раз, когда я запускаю код, мячик движется неравномерно. Я сделал второй прямоугольник, чтобы попытаться контролировать позиционирование, но в итоге мяч образует такой путь: this

Очевидно, что что-то не так с позиционированием на каждом кадре, но я не уверен, почему какой-либо из кадров может оказаться неуместным, поскольку их положение определяется их центральной точкой.

Вот изображение мяча:

enter image description here

Это 16x16 (квадрат), поэтому я ошеломлен тем, почему изображение идет не по правильному пути.

Источник

Ответы (1)

avatar
Rabbid76
24 мая 2019 в 19:10
1

Обратите внимание, что повернутое изображение различается по размеру. См. Как повернуть изображение вокруг центра с помощью Pygame?.

Получить прямоугольник повернутого изображения и установить центр прямоугольника по центру вспомогательного прямоугольника rotaterect. Это приводит к тому, что изображение симметрично выравнивается относительно центра.
Вы пропустили обновление ball.rect до фактического размера повернутого изображения:

ball.rect = ball.image.get_rect()
rotaterect.topleft = (5*i,((i-20)*(i-20) + 1)/5)
ball.rect.center = rotaterect.center

Пример:

for i in range(60):
    ball.image = pygame.transform.rotate(ball.orig_image, i*20)
    ball.rect = ball.image.get_rect()
    rotaterect.topleft = (5*i,((i-20)*(i-20) + 1)/5)
    ball.rect.center = rotaterect.center
    screen.blit(ball.image, ball.rect)
    pygame.display.update()
Alex Foster
24 мая 2019 в 19:29
0

Хм. Я полагал, что центр вспомогательного прямоугольника — rotaterect — будет следовать плавной траектории, поскольку он не вращается и, следовательно, не должен изменяться в размере. Я предполагаю, что мои рассуждения отключены ... почему бы это быть?

Rabbid76
24 мая 2019 в 19:35
1

@AlexFoster Теперь я понимаю ваше решение. Это сработает, если вы обновите ball.rect до фактического размера изображения: ball.rect = ball.image.get_rect(). Я меняю ответ.