Sprite表示精灵,是计算机图形学术语,指屏幕上可以移动的任何对象。当玩任何2D游戏时,在屏幕上看到的所有对象都是精灵。精灵可以设置动画,可以由玩家控制,甚至可以相互交互。
在游戏循环的更新和渲染部分,需要更新和渲染精灵,但是可以想象,如果游戏中包含大量精灵,那么游戏循环的这些部分可能会变得非常漫长而复杂。
Pygame为此提供了一个很好的解决方案:Sprite Group (精灵组)。
创建一个精灵组来容纳游戏中所有的精灵:
- all_sprites = pygame.sprite.Group()
现在可以通过在游戏循环中添加以下内容来利用该精灵组:
- # 更新游戏
- all_sprites.update()
- # 渲染
- screen.fill(WHITE)
- all_sprites.draw(screen)
对于创建的每个精灵,只需确保将其添加到all_sprites精灵组中,它将自动在游戏窗口上绘制并在每次循环中进行更新。
(1)创建精灵
现在开始创建第一个精灵。在Pygame中,精灵是对象。首先在template.py中定义精灵类Player,类中定义__init__()方法,其中每个精灵都必须有两个属性,分别是image(图像)和rect(矩形),并将其初始化:
- class Player(pygame.sprite.Sprite): # 继承pygame中的Sprite类
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.Surface((30, 30))
- self.image.fill(BLUE)
- self.rect = self.image.get_rect()
- self.rect.centerx = WIDTH / 2
- self.rect.centery = HEIGHT - 30
其中,定义了图像属性——只是创建了一个简单的30*30的正方形,并用蓝色填充。还定义了矩形属性,get_rect()用于查看图像并计算将其包围的矩形。在Pygame中,可以使用矩形来跟踪对象的坐标,也可以使用矩形将对象放置在游戏窗口上的任意位置。
再创建第二个精灵,这是一个50*50的正方形,并用红色填充:
- class Player1(pygame.sprite.Sprite):
- def __init__(self):
- pygame.sprite.Sprite.__init__(self)
- self.image = pygame.Surface((50, 50))
- self.image.fill(RED)
- self.rect = self.image.get_rect()
- self.rect.centerx = WIDTH / 2
- self.rect.centery = HEIGHT / 2
然后分别创建Player类的实例player和Player1类的实例player1,还需要将player和player1添加到all_sprites精灵组中:
- all_sprites = pygame.sprite.Group()
- player = Player()
- player1 = Player1()
- all_sprites.add(player, player1)
最后进行渲染部分,在游戏循环的“screen.fill(WHITE)”代码下面添加如下代码:
- all_sprites.draw(screen)
运行结果如图1所示。
图1 创建精灵的运行结果
(2)移动精灵
游戏循环显示每一帧,如果需要移动精灵,那么需要在精灵类Player中添加update()方法来更新精灵的位置:
- def update(self):
- self.rect.x += 3
上述代码的update()方法很简单,就是使精灵矩形的x坐标增加3个像素,即向游戏窗口右边移动3个像素。每次游戏循环,都会调用update()方法,精灵会一直右移。但是这样有个缺点,当精灵移动到游戏窗口最右边时,就会消失不见。可以改动update()方法的代码,使得当精灵移动到最右边时,回到最左边继续移动:
- def update(self):
- self.rect.x += 3
- if self.rect.left > WIDTH:
- self.rect.right = 0
同样,在Player1类中添加update()方法,使精灵矩形向游戏窗口左边移动2个像素,当精灵移动到最左边时,回到最右边继续移动:
- def update(self):
- self.rect.x -= 2
- if self.rect.left < 0:
- self.rect.right = WIDTH
all_sprites是一个精灵组,对该组进行更新,就是对组中每一个精灵进行更新。在游戏循环中,精灵组all_sprites调用update()方法,则组中每一个精灵将自动在游戏窗口上绘制并在每次循环中进行更新:
- all_sprites.update()
运行结果如图2所示。
图2 移动精灵的运行结果