python - 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()
解决方案
如果您使用相同的变量
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]
推荐阅读
- python - 使用 numpy 向量化循环
- android - 使用 chrome://inspect/#devices 时看不到代码流动?
- java - 给一个数组给多个方法
- sql - 在 Google BigQuery 中按用户和月份分组
- node.js - React - 打开 PDF 文件而不导入它们
- python - Python 请求基本命令返回错误 - 出了什么问题?
- python - TensorFlow 2.3 不使用 GPU
- vue.js - Vuetify v-calendar:按选定日期显示事件名称
- reactjs - 如何获取在路径变量中具有键值的获取请求
- python - 如何从 skimage.measure 中消除 compare_ssim 的 SSIM 图像输出中差异周围的边缘