每帧加载和blitting图像?

时间:2012-08-22 12:56:23

标签: python pygame sprite

我有一个简单的自上而下的垂直射击游戏,我正在玩弄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并看到某种性能提升?

1 个答案:

答案 0 :(得分:2)

  • 我希望每次创建一个新的Laser()时,这都会阻止Python将新的图像实例加载到内存中。但这会像我预期的那样起作用吗?

是。这不仅节省了内存,因为每个实例都只有对类变量的引用,它也会提高性能,因为图像只加载一次。

  • 第二个问题是将所有活动精灵blit到pygame表面上。

这取决于。如果您的帧率是正常的,那么坚持下去。如果您的帧率开始下降,请查看DirtySprite,也许这是article

另一个派上用场的python类是LayeredDirty精灵组,它会自动处理脏精灵并仅为你更新相关的屏幕部分而不是整个屏幕。

  • 必须单独blit每个对象似乎是多余的

使用精灵组,例如LayeredDirty或简单Group,您只需将精灵添加到组中,然后调用精灵组的draw方法。

sprites = pygame.sprite.LayeredDirty((sprite1, sprite2, sprite3))
sprites.add(sprite4)
...
sprites.draw(pygame_screen)

使用精灵组还可以使用pygame.sprite.groupcollidepygame.sprite.spritecollideany

在组之间进行简单的碰撞检测