Pygame - вращать спрайт и следовать по пути одновременно - PullRequest
2 голосов
/ 24 мая 2019

Я пытаюсь оживить брошенный мяч и хочу, чтобы он вращался и следовал по гладкой, параболической траектории одновременно.Тем не менее, я просто не могу заставить 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 Ответ

1 голос
/ 24 мая 2019

Обратите внимание, что повернутое изображение различается по размеру. См. Как повернуть изображение вокруг его центра с помощью 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

Пример:

* +1012 *
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()
...