《pygame中Sprite类实现多帧动画》注-显示静态图片2-2
3 精灵组
3.1 精灵组介绍
精灵组是Pygame提供的一个容器类,用于管理和操作多个精灵(Sprite)对象。它可以批量处理精灵的更新、绘制、碰撞检测等操作,大大简化了游戏开发流程。虽然挡墙只有一个精灵,但是为了之后能够扩展到多个精灵,我们依然使用精灵组来管理这一个精灵。
3.2 使用精灵组管理精灵
3.2.1 创建精灵组
创建精灵组的代码如图5所示。
![]()
图5 创建精灵组的代码
3.2.2 将精灵加入到精灵组
将创建的精灵mysprite1加入到精灵组的代码如图6所示。
![]()
图6 将精灵加入到精灵组的代码
3.2.3 更新精灵组的精灵
虽然我们要实现的精灵是静态的,但是实际情况下精灵应该是在不断变化的(位置、形态等),因此需要通过图7所示的代码更行精灵组中的精灵。
![]()
图7 更新精灵组精灵的代码
精灵组sprite_group的update()方法,实际上隐式地调用了在该组中所有精灵的update()方法。因为MySprite类没有重写update()方法,此时调用的是其父类pygame.sprite.Sprite()类的update()方法。
3.2.4 显示精灵组的精灵
在更新了精灵组中所有精灵的位置及形态后,使用图8所示的代码显示精灵组中的精灵。
![]()
图8 显示精灵组精灵的代码
其中,screen为创建的窗口Surface,表示所有的精灵都在screen中显示。精灵组sprite_group的draw()方法,实际上隐式地调用了在该组中所有精灵父类pygame.sprite.Sprite的draw()方法。
注意2 如果MySprite类重写了update()方法,则sprite_group.update()会调用chongxie的update()方法;但是即使MySprite类重写了draw()方法,sprite_group.draw()也只会调用pygame.sprite.Sprite类的update()方法,而不是其子类MySprite的draw()方法。
4 完整代码
完成代码如下所示。
import pygame
from pygame.locals import *SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
BACKGROUND = 'green'
FPS = 60
FILEPATH = '2.png' class MySprite(pygame.sprite.Sprite):def __init__(self, filepath):super().__init__()self.image = pygame.image.load(filepath).convert_alpha()self.rect = self.image.get_rect(center=(SCREEN_WIDTH/2, SCREEN_HEIGHT/2))pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))mysprite1 = MySprite('./'+FILEPATH)
sprite_group = pygame.sprite.Group()
sprite_group.add(mysprite1)running = True
clock = pygame.time.Clock()while running:for event in pygame.event.get():if event.type == QUIT:running = Falsescreen.fill(BACKGROUND)sprite_group.update()sprite_group.draw(screen)pygame.display.update()clock.tick(FPS)pygame.quit()