0

我有一个简单的自上而下的垂直射击游戏 la Galaga,我正在玩弄它。但是,在查看文档后,我对如何有效地加载图像以及是否每帧都进行 blit 处理感到有些困惑。所有的图像都是通过几个继承 pygame sprite 类的类加载的。目前,我正在将图像作为类级别属性加载,如下所示:

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]

我希望这可以防止 Python 在我每次创建新的 Laser() 时将图像的新实例加载到内存中。但这会像我预期的那样工作吗?

第二个问题源于将所有活动的 sprite 放到 pygame 表面上。目前,我遍历了一系列 Laser()、Enemy() 和诸如此类的对象,并在调用 pygame.display.update() 之前分别对每个对象进行 blit。必须单独对每个对象进行 blit 似乎是多余的,所以我问这是否是 pygame 实现的最有效的方法。或者,有没有办法一次对每个对象进行 blit 并看到某种性能改进?

4

1 回答 1

2
  • 我希望这可以防止 Python 在我每次创建新的 Laser() 时将图像的新实例加载到内存中。但这会像我预期的那样工作吗?

是的。这不仅可以节省内存,因为每个实例都只会引用类变量,而且还可以提高性能,因为图像只加载一次。

  • 第二个问题来自于将所有活动精灵 blitting 到 pygame 表面上。

这取决于。如果你的帧率没问题,那就坚持下去。如果您的帧率开始下降,请查看DirtySprite,也许还有这篇文章

另一个派上用场的 Python 类是LayeredDirtysprite 组,它会自动处理脏 sprite 并为您只更新相关的屏幕部分而不是整个屏幕。

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

使用精灵组,例如 theLayeredDirty或 simple Group,您将精灵添加到组中一次,然后调用draw精灵组的方法。

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

使用精灵组还可以让您在组之间进行简单的碰撞检测,使用pygame.sprite.groupcollidepygame.sprite.spritecollideany

于 2012-08-22T13:02:34.390 回答