小学课后服务 Python少儿编程 进阶篇:15-飞机大战6 课件 (13张PPT)

资源下载
  1. 二一教育资源

小学课后服务 Python少儿编程 进阶篇:15-飞机大战6 课件 (13张PPT)

资源简介

(共13张PPT)
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
少儿编程课
飞机大战6
飞机生命值
在之前的版本中,陨石碰到飞机,游戏立马结束,接下来我们为飞机添加生命值
1
首先在初始化飞机的时候,给定血量100
2
当陨石和飞机相碰,飞机扣除20点血量如果血量扣完了,则游戏结束
3
当陨石和飞机相碰,陨石消失,为防止陨石数量减少,在生成一个陨石出来
self.hp = 100
# 检测飞机和陨石之间的碰撞
hits = pygame.sprite.spritecollide(player, all_meteorite, True, pygame.sprite.collide_circle)
for hit in hits:
player.hp ‐= 20
# 如果碰撞,则游戏结束
if player.hp == 0:
running = False
# 检测飞机和陨石之间的碰撞
hits = pygame.sprite.spritecollide(player, all_meteorite, False, pygame.sprite.collide_circle)
for hit in hits:
player.hp -= 20
# 新产生一个陨石并加入两个精灵组
meteorite = Meteorite()
all_sprites.add(meteorite)
all_meteorite.add(meteorite)
# 如果碰撞,则游戏结束
if player.hp == 0:
running = False
简化代码
对于这种重复性出现的代码,我们可以用方法替代重复
3
然后在上述三个对应的地方调用new_meteorite()方法就可以了
# 新产生一个陨石并加入两个精灵组
meteorite = Meteorite()
all_sprites.add(meteorite)
all_meteorite.add(meteorite)
这时,你可能发现了,产生一个新陨石,并把陨石加入到陨石和全部精灵组代码在程序中出现了好几次
# 新产生一个陨石并加入两个精灵组
new_meteorite():
meteorite = Meteorite()
all_sprites.add(meteorite)
all_meteorite.add(meteorite)
1、循环8次,生成8个陨石时
2、子弹打掉陨石时
3、陨石和飞机碰撞的时
2
1
将飞机生命值画到屏幕中
使用之前的draw_text方法,将飞机剩余血量绘制到屏幕左上角
运行程序,效果如下:
2
1
# 绘制生命值
draw_text(screen, 'hp:'+str(player.hp), 18, 30, 10)
爆炸效果
爆炸效果的添加
2
爆炸效果也是精灵,不同与子弹等精灵,爆炸精灵不会沿x、y轴运动,它最大的特点就是图片在一直变化,组成帧动画的效果,如我们经常见到的GIF动态图
1
将素材准备好,可以自行选择,这里以蓝色为例
爆炸精灵类的创建
2
将素材存入列表
1
explosion_anim = []
for i in range(9):
img = pygame.image.load('img/picV382_boom_baiYin_00' + str(i) + '.png')
explosion_anim.append(img)
# 爆炸效果
class Explosion(pygame.sprite.Sprite):
def __init__(self, center):
pygame.sprite.Sprite.__init__(self)
# 初始图片为爆炸的第一张图
self.image = explosion_anim[0]
self.rect = self.image.get_rect()
# 指定爆炸的中心点
self.rect.center = center
创建爆炸精灵类,定义初始化方法
3
在初始化方法中定义一个用于表示图片下标的变量
# 当前图片的下标
self.frame = 0
def update(self):
self.frame += 1
if self.frame == len(explosion_anim):
self.kill()
else:
# 更换图片,达到帧动画的效果
self.image = explosion_anim[self.frame]
4
创建爆炸精灵类,定义初始化方法
爆炸精灵类创建完成,接下来在子弹和陨石以及飞机和陨石碰撞时产生一个爆炸精灵
2
子弹和陨石碰撞时
1
飞机和陨石碰撞时
3
运行程序,效果如下:
# 爆炸效果
expl = Explosion(hit.rect.center)
all_sprites.add(expl)
# 爆炸效果
expl = Explosion(hit.rect.center)
all_sprites.add(expl)
注意:这里不要忘了将爆炸精灵也加入到all_sprite精灵组中,这样Explosion的update方法才能被调用,我们才能看到爆炸的效果。
根据运行效果可以发现:爆炸效果太大了、爆炸的时间太短
现在,来解决爆炸效果不佳的问题
2
在定义n张爆炸图片的地方,缩放一下图片
1
在初始化方法中,定义一个用于规定多长时间切换一张图片的时间间隔
3
同样使用pygame的time模块控制游戏节奏
explosion_anim = []
for i in range(9):
img = pygame.image.load('img/picV382_boom_baiYin_00' + str(i) + '.png')
# 缩放图片
img = pygame.transform.scale(img, (150, 150))
explosion_anim.append(img)
# 切换时间的间隔为50毫秒
self.framerate = 50
# 爆炸效果
class Explosion(pygame.sprite.Sprite):
def __init__(self, center):
……
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now ‐ self.last_update > self.frame_rate:
self.last_update = now
……
在Explosion的__init__方法中,我们先记一次时,然后在update方法中再次记一下时,让这两个时间的间隔和上面定义的frame_rate作对比就可以了
练习
Exercises


线





同样的道理,尝试来控制子弹发射的节奏
Thanks!

展开更多......

收起↑

资源预览