Как заставить вращение (по центру) этого пигамного спрайта работать? - PullRequest
0 голосов
/ 20 сентября 2018

Мне очень трудно создать вращение одного спрайта с помощью Pygame.

Я следую этому коду (https://stackoverflow.com/a/47688650/5074998), чтобы получить вращение центра спрайта. А вот мой текущий код:

import pygame

FPS: int = 100
W = 600
H = 400
MAGENTA = (255, 0, 255)
BLACK = (0, 0, 0)

pygame.init()
screen = pygame.display.set_mode([W, H])
pygame.display.set_caption("Cars")
clock = pygame.time.Clock()


class sp():
    def __init__(self):
        self.image = pygame.Surface((122, 70), pygame.SRCALPHA)
        pygame.draw.polygon(self.image, pygame.Color('dodgerblue1'),
                            ((1, 0), (120, 35), (1, 70)))
        self.orig_image = self.image
        self.rect = self.image.get_rect(center=[W / 2, H / 2])
        self.angle = 0

    def update(self):
        self.angle += 2
        self.rotate()
        screen.blit(self.image, [100, 100])

    def rotate(self):
        self.image = pygame.transform.rotozoom(self.orig_image, self.angle, 1)
        self.rect = self.image.get_rect(center=self.rect.center)


sp1 = sp()
out = pause = False

while not out:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT or event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            out = True
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE:
                pause = not pause
    if not pause:
        screen.fill(BLACK)
        sp1.update()
        pygame.display.flip()

Но я не могу понятьпочему я получаю это:

enter image description here

Может ли кто-нибудь мне помочь?

1 Ответ

0 голосов
/ 20 сентября 2018

Это происходит потому, что вы бьете self.image в позиции [100, 100] вместо self.rect (что означает координаты self.rect.topleft).Размер изображения после каждого поворота будет разным, и если вы просто перетянете его с теми же верхними левыми координатами, изображение будет колебаться так, потому что центр находится где-то еще в каждом кадре.Вы можете увидеть это, нарисовав ограничивающий прямоугольник на [100, 100]:

pygame.draw.rect(screen, (255, 0, 0), [(100, 100), self.image.get_size()], 1)

. Чтобы решить эту проблему, вы должны каждый раз создавать новый прямоугольник и устанавливать его center координаты равными center координатампредыдущего прямоугольника.Это также отрегулирует topleft координаты (где изображение будет перетекать), чтобы изображение оставалось по центру.Затем просто перетащите изображение в прямоугольник:

screen.blit(self.image, self.rect)

Нарисуйте self.rect, чтобы увидеть, как координата topleft все время меняется, тогда как центр не будет двигаться:

pygame.draw.rect(screen, (255, 0, 0), self.rect, 1)
...