如何使这个 pygame 精灵旋转(以中心为中心)?
How to make the rotation (by the center) of this pygame sprite work?
我很难使用 pygame 创建单个精灵旋转。
我正在按照此代码 () 获取精灵的中心旋转。这是我当前的代码:
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()
但我不明白为什么我得到这个:
谁能帮帮我?
发生这种情况是因为您在 [100, 100]
位置而不是 self.rect
(这意味着在 self.rect.topleft
坐标)处 blitting self.image
。每次旋转后图像的大小都不同,如果你只是在相同的左上角坐标处 blit 它,图像会像那样摆动,因为中心在每一帧的其他地方。您可以通过在 [100, 100]
:
处绘制边界矩形来看到这一点
pygame.draw.rect(screen, (255, 0, 0), [(100, 100), self.image.get_size()], 1)
要解决此问题,您必须每次创建一个新的矩形并将其 center
坐标设置为前一个矩形的 center
坐标。这也将调整 topleft
坐标(图像被 blitted 的位置),以便图像保持居中。然后在矩形上 blit 图像:
screen.blit(self.image, self.rect)
画self.rect
,看看现在topleft
坐标是怎么一直变化的,而中心不会移动:
pygame.draw.rect(screen, (255, 0, 0), self.rect, 1)
我很难使用 pygame 创建单个精灵旋转。
我正在按照此代码 () 获取精灵的中心旋转。这是我当前的代码:
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()
但我不明白为什么我得到这个:
谁能帮帮我?
发生这种情况是因为您在 [100, 100]
位置而不是 self.rect
(这意味着在 self.rect.topleft
坐标)处 blitting self.image
。每次旋转后图像的大小都不同,如果你只是在相同的左上角坐标处 blit 它,图像会像那样摆动,因为中心在每一帧的其他地方。您可以通过在 [100, 100]
:
pygame.draw.rect(screen, (255, 0, 0), [(100, 100), self.image.get_size()], 1)
要解决此问题,您必须每次创建一个新的矩形并将其 center
坐标设置为前一个矩形的 center
坐标。这也将调整 topleft
坐标(图像被 blitted 的位置),以便图像保持居中。然后在矩形上 blit 图像:
screen.blit(self.image, self.rect)
画self.rect
,看看现在topleft
坐标是怎么一直变化的,而中心不会移动:
pygame.draw.rect(screen, (255, 0, 0), self.rect, 1)