内容正文:
少儿编程课
1
飞机大战4
本节我们来增加子弹和陨石、飞机和陨石之间的碰撞效果,并使用图片素材替换方块
3
碰撞检测
4
1
创建子弹与陨石精灵组
2
分别在产生陨石和子弹的地方,加入相应的精灵组
# 定义陨石精灵组
all_meteorite = pygame.sprite.Group()
# 定义子弹精灵组
all_bullets = pygame.sprite.Group()
# 定义8个陨石并加入到精灵组all_sprites
for i in range(8):
…
# 在循环产生陨石时,加入陨石精灵组
all_meteorite.add(met)
def shoot(self):
…
# 在飞机的shoot方法中产生子弹时,加入子弹精灵组
all_bullets.add(bullet)
接着来看碰撞,pygame提供了处理精灵组之间碰撞的函数
精灵组的碰撞—groupcollide函数原型
groupcollide(group1, group2, dokill1, dokill2, collided = None) ‐>Sprite_dict
group1 : 精灵组1
group2 : 精灵组2
dokill1 : 发生碰撞时,是否销毁精灵组1中的发生碰撞的精灵。
dokill2 : 发生碰撞时,是否销毁精灵组2中的发生碰撞的精灵。
collided :自定义的回调函数,你可以自己编写碰撞检测函数。碰撞检测函数的参数是两个精灵,返回值是True/False
返回值是一个字典,键是精灵组1中发生碰撞的精灵,值是精灵组2中与该精灵发生碰撞的精灵的列表。
现在来添加子弹与陨石的碰撞检测
1
精灵组碰撞处理
2
由于碰撞后销毁了陨石,所以需要在碰撞后添加一个新的陨石出来
# 检测子弹组和陨石组是否碰撞
hits = pygame.sprite.groupcollide(all_meteorite, all_bullets, True, True)
# 如果碰撞了,则重新生成一个陨石,并加入到all_sprites和all_meteorite精灵组
for hit in hits:
meteorite = Meteorite()
all_sprites.add(meteorite)
all_meteorite.add(meteorite)
运行程序,体验一下效果
飞机和陨石的碰撞效果
1
增加飞机与陨石的碰撞检测
2
运行程序,体验效果
不同与子弹和陨石,飞机与陨石是精灵和精灵组之间的碰撞。单个精灵和某个精灵组之间的碰撞检测,使用spritecollide方法
# 检测飞机和陨石之间的碰撞
hits = pygame.sprite.spritecollide(player, all_meteorite, True)
# 如果碰撞,则游戏结束
if hits:
running = False
改头换面
10
在前面的课程中,无论是飞机、陨石还是子弹,我们都是使用方块代替的,现在我们就把他们换成真正的图片素材
1
在工程目录新建img文件夹,然后将素材拷贝到文件夹中
2
首先替换陨石图片
# 定义陨石的图形
self.image = pygame.Surface((30, 40))
# 定义陨石的颜色为红色
self.image.fill((255, 0, 0))
在Meteorite类的__init__方法中,我们将
更换为:
self.image = pygame.image.load("img/img_meteorite.png")
练习
Exercises
密
封
线
内
不
准
答
题
将飞机的图片、子弹的图片都更改
在原先设置背景颜色的地方,修改成如下代码
更改游戏的背景,效果演示
# 绘制屏幕的背景颜色
# screen.fill(COLOR_BLACK)
background=pygame.image.load("img/img_bg.jpg").convert()
screen.blit(background,background.get_rect())
1
运行程序,效果如下:
2
总结
Summary
Pygame中的碰撞效果
√
Pygame素材导入
√
Thanks!
15
$$