我有一个简单的自上而下的垂直射击游戏,我正在玩弄Galaga。但是,在查看完文档之后,我对如何有效地加载图像以及是否每帧都将它们搞定都感到困惑。所有图像都通过几个继承pygame精灵类的类加载。目前,我正在将图像作为类级别属性加载:
class Laser(pygame.sprite.Sprite):
image = None
def __init__(self, start_x, start_y):
pygame.sprite.Sprite.__init__(self)
self.pos_x = start_x
self.pos_y = start_y
if Laser.image is None:
Laser.image = pygame.image.load('img/laser_single.png')
self.image = Laser.image
self.rect = self.image.get_rect()
self.rect.topleft = [self.pos_x, self.pos_y]
我希望每次创建一个新的Laser()时,这都会阻止Python将新的图像实例加载到内存中。但这会像我预期的那样起作用吗?
第二个问题源于将所有活动的精灵打到pygame表面上。目前,我在调用pygame.display.update()之前遍历一个Laser(),Enemy()和whatnot对象的列表并单独blit。单独对每个对象进行blit似乎是多余的,所以我要问这是否是pygame实现的最有效的方法。或者,是否有办法立即对每个对象进行blit并看到某种性能提升?
答案 0 :(得分:2)
是。这不仅节省了内存,因为每个实例都只有对类变量的引用,它也会提高性能,因为图像只加载一次。
这取决于。如果您的帧率是正常的,那么坚持下去。如果您的帧率开始下降,请查看DirtySprite
,也许这是article。
另一个派上用场的python类是LayeredDirty
精灵组,它会自动处理脏精灵并仅为你更新相关的屏幕部分而不是整个屏幕。
使用精灵组,例如LayeredDirty
或简单Group
,您只需将精灵添加到组中,然后调用精灵组的draw
方法。
sprites = pygame.sprite.LayeredDirty((sprite1, sprite2, sprite3))
sprites.add(sprite4)
...
sprites.draw(pygame_screen)
使用精灵组还可以使用pygame.sprite.groupcollide
和pygame.sprite.spritecollideany