首页 > 解决方案 > Pygame,旋转图像而无需在每次迭代中加载图像

问题描述

所以我在 python 中编写了一个简单的游戏,我对图像进行了 blitting,我创建了一个对象,并且在循环的每次迭代中,我更新了该对象的 x 和 y,只要不需要旋转,它就可以工作文件。当需要旋转时,图像会消失,所以我在旋转时再次加载图像。当我再次加载图像时,我的游戏滞后了很多。这是我的那个 Sprite 类的代码

class PlayerSegment(pygame.sprite.Sprite):

def __init__(self, x, y, img, angle1=0, rotate=False, wid=80, hie=80, tl=False, cvt=False):
    super().__init__()
    self.x = x
    self.y = y
    self.img = img
    self.rotate, self.angle1 = rotate, angle1
    self.wid, self.hie, self.tl, self. cvt = wid, hie, tl, cvt
    self.image = pygame.image.load(self.img).convert_alpha()
    self.image = pygame.transform.scale(self.image, (self.wid, self.hie))
    if self.rotate:
        self.image = pygame.transform.rotate(self.image, self.angle1)
    self.rect = self.image.get_rect()
    if self.tl:
        self.rect.topleft = [self.x, self.y]
    else:
        self.rect.center = [self.x, self.y]
    self.width = self.image.get_width
    self.height = self.image.get_height

def get_image(self):
    if self.rotate:
        self.image = pygame.image.load(self.img)
        self.image = pygame.transform.scale(self.image, (self.wid, self.hie))
        self.image = pygame.transform.rotate(self.image, self.angle1)

    self.image.set_colorkey(WHITE)
    self.image.set_colorkey(BLACK)
    self.rect = self.image.get_rect()
    if self.tl:
        self.rect.topleft = [self.x, self.y]
    else:
        self.rect.center = [self.x, self.y]
    self.width = self.image.get_width()
    self.height = self.image.get_height()

我使用这个课程如下。下面的代码进入一个循环

player_loader = SegmentClass.PlayerSegment(player_x, player_y, GameArt.spaceship[sprite_no], tl=False,
                                  angle1=angle, rotate=True, wid=70, hie=70)
player_loader.get_image()
display_surface.blit(player_loader.image, player_loader.rect)
player_loader.x, player_loader.y = player_x, player_y
player_loader.angle1 = angle

我在其他地方更新角度和 player_x、player_y。检查 Sprite 类,我想更新对象的 x 和 y 而不必再次加载图像。只要我不使用旋转功能,我就可以实现它。如何旋转图像而不必一次又一次地加载图像?简而言之,我想删除

self.image = pygame.image.load(self.img)

在方法 get_image()

标签: pythonpygamegame-development

解决方案


如果您使用相同的变量

 self.image = rotation(self.image) 

然后你从内存中删除原始图像

您应该将原始图像保存在其他变量中

self.image_original = pygame.image.load(self.img)

并使用

self.image = self.image_original

或旋转它

self.image = rotate(self.image_original) 

顺便说一句:如果你总是使用相同的比例,那么你可以保持重新缩放的图像

self.image_original = pygame.image.load(self.img)
self.image_scaled = scale(self.image_original)

并使用

self.image = self.image_scaled

或旋转它

self.image = rotate(self.image_scaled) 

顺便说一句:您还可以将旋转的图像保存在字典中

self.image_rotated[90] = rotate(self.image_scaled, 90) 

后来只检查

if angle not in self.image_rotated:
      self.image_rotated[angle] = rotate(self.image_scaled, angle) 

self.image = self.image_rotated[angle]

推荐阅读