判断两个或多个Sprite图形是否相撞也是在Pygame中经常要完成的。接下来我们通过编程实现如下功能,鼠标控制一个蓝色方块去触碰其他方块,要触碰的方块有两种颜色,红色和绿色,当鼠标控制的蓝色方块碰到绿色方块,则分数加1,碰到红色方块则分数减1,如图1和图2所示。
图1 程序界面
图2 分数显示
以上功能可以通过Pygame的Sprite类的碰撞检测实现。
1 定义Sprite派生类
首先定义Sprite派生类Block,Block表示程序中的方块,代码如下所示。
class Block(pygame.sprite.Sprite):
def __init__(self, color, width, height):
super().__init__()
self.image = pygame.Surface((width, height))
self.image.fill(color)
self.rect = self.image.get_rect()
其中,Block类的__init__()方法的color参数表示方块的颜色,width和height表示方块的宽度和高度。在__init__()方法中首先调用父类也就是Sprite类的__init__()方法;之后通过pygame.Surface()方法创建方块;接下来调用fill()方法为方块填充颜色;最后通过get_rect()获取方块的位置。
相关链接1 pygame.sprite.Sprite类的使用,请参考
Pygame中Sprite类的使用3_棉猴的博客-CSDN博客
2 创建三种颜色方块
通过创建Block类的实例来创建三种颜色的方块。
2.1 创建绿色方块
假设绿色方块有50个,创建绿色方块的代码如下所示。
for i in range(50):
block = Block(GREEN, 20 ,15)
block.rect.x = random.randrange(screen_width)
block.rect.y = random.randrange(screen_height)
block_list.add(block)
all_sprites_list.add(block)
其中block即为Bloct类的实例,通过random.randrange()方法随机设置绿色方块的位置,之后把创建的绿色方法添加到block_list和all_sprites_list中。以上两个变量的类型是pygame.sprite.Group类的实例,分别用来保存所有绿色方块和所有三种颜色的方块。
相关链接2 pygame.sprite.Group类的使用,请参考
Pygame中Sprite类的使用3_棉猴的博客-CSDN博客
2.2 创建红色方块
假设红色方块有10个,创建红色方块的代码如下所示。
for i in range(10):
block = Block(RED, 20 ,15)
block.rect.x = random.randrange(screen_width)
block.rect.y = random.randrange(screen_height)
block_bad_list.add(block)
all_sprites_list.add(block)
其中,block_bad_list是pygame.sprite.Group类的实例,将创建的红色方块分别保存到block_bad_list和all_sprites_list中。
2.3 创建蓝色方块
蓝色方块表示鼠标,只需要创建1个即可,其代码如下所示。
player = Block(BLUE, 20, 15)
all_sprites_list.add(player)
将蓝色方块player保存到all_sprites_list中。