Python-PyGame实现飞机大战游戏(3)
前言
前两节已经实现游戏基本功能,接下来是对游戏的完善,包括爆炸动画、计分、结束画面等。
一、调整游戏帧率
1、简要说明
这个其实是在刚开始开发就需要做的,这里是为了方便读者理解,将其挪到游戏基本功能完成后再进行调整。基本思路其实很简单,就是创建时钟对象进行管理。
2、实现
创建时钟对象并设定帧率
# 创建时钟对象控制游戏帧率
clock = pygame.time.Clock()
# 游戏帧率(每秒刷新次数)
RATE = 60
主循环内进行设置
# 设定游戏帧率
clock.tick(RATE)
此时在运行有没有发现游戏速度变得巨慢,那是因为之前由于没有设定游戏帧率,所以游戏刷新速度非常快,在设定子弹发射速度时设定间隔非常大,此时改过来即可。
更改处:
# 根据计数切换飞机图片
if tick % 13 == 0:
hero.image = player_plane_images[tick % 2]
# 调用射击方法
if tick % 40 == 0:
hero.shoot(bullet_img)
另外再更改
Bullet.speed=4
Hero.speed=3
Enemy.speed=2
即可。
3、运行展示
二、添加爆炸动画
1、说明
爆炸动画其实是将几张图片按照一定频率轮换输出形成的动画,此节重要之处在于爆炸动画的位置和切换图片的下标,这两个弄清楚了爆炸动画就很简单了。
2、实现
(1)准备工作
'载入爆炸动画'
# 载入爆炸图片
boom_img = pygame.image.load('resources/images/boom.png')
# 对爆炸图片进行切割,切成四个图片,轮换播放,形成爆炸动画效果
boom_img1 = boom_img.subsurface(pygame.Rect(0, 0, 71, 85))
boom_img2 = boom_img.subsurface(pygame.Rect(66, 0, 71, 85))
boom_img3 = boom_img.subsurface(pygame.Rect(131, 0, 71, 85))
boom_img4 = boom_img.subsurface(pygame.Rect(206, 0, 80, 85))
# 将爆炸图片存入列表中
boom_imgs = []
boom_imgs.append(boom_img1)
boom_imgs.append(boom_img2)
boom_imgs.append(boom_img3)
boom_imgs.append(boom_img4)
# 击毁组,存储需要展示爆炸动画的精灵
boom_group = pygame.sprite.Group()
(2)敌机爆炸
在敌机类中添加索引
self.boom_index = 0 # 爆炸动画切换标志位
更改碰撞检测处代码
enemy_down_list = pygame.sprite.groupcollide(enemy_group, hero.bullet_group, True, True)
if len(enemy_down_list) > 0:
boom_group.add(enemy_down_list) # 若发生碰撞,将碰撞的精灵加入击毁组
绘制爆炸动画
# 爆炸动画
for boom_sprite in boom_group:
# 绘制画面
screen.blit(boom_imgs[boom_sprite.boom_index], boom_sprite.rect)
if tick % 6 == 0:
if boom_sprite.boom_index < 3:
boom_sprite.boom_index = boom_sprite.boom_index + 1 # 更新索引
else:
boom_group.remove(boom_sprite) # 爆炸动画结束,将精灵移除
(3)玩家战机爆炸
玩家类中添加
# 是否被击中
self.isHit=False
# 爆炸动画切换索引
self.boom_index = 0
主循环中更改玩家碰撞检测后的处理:
'''敌机与玩家碰撞处理'''
# 碰撞检测(参数:sprite,group,后面的True是指kill掉碰撞的group内的精灵)
hero_down = pygame.sprite.spritecollide(hero, enemy_group, True)
# 如果hero_down长度大于0,则证明玩家发生碰撞,游戏结束
if len(hero_down) > 0:
# 敌机爆炸
boom_group.add(hero_down)
# 战机被击中标志位改为True
hero.isHit = True
# 玩家爆炸
if hero.isHit:
hero.image = boom_imgs[hero.boom_index] # 切换玩家图片
hero.boom_index += 1 # 更新索引
if hero.boom_index >= 4: # 爆炸动画结束
break
3、运行展示
三、游戏结束界面
1、说明
游戏结束就是在玩家战机坠毁后,即程序break跳出主循环后再在界面绘制出游戏结束界面。
2、实现
加载图片
# 载入游戏结束图片
gameover_img = pygame.image.load('resources/images/fail.png')
在主循环后添加
# 绘制游戏结束图片
screen.blit(gameover_img, (0, 0))
# 更新画面
pygame.display.update()
# 用一个while循环,可停留在最后这个画面
while True:
# 处理退出
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
四、计分
1、说明
计分规则按照每击落一架飞机一分计算,将分数绘制到界面即可。
2、实现
设置字体及初始化分数(设置字体一定要在pygame.init()后进行)
'分数相关'
# 可用下面方法打印可用字体
# print(pygame.font.get_fonts())
# 设置字体及大小
font = pygame.font.SysFont("方正小标宋简体", 20)
# 分数
score = 0
显示出文字
'''分数相关'''
# 连接文字
score_text = '成绩:' + str(score)
# 生成surface
score_surface = font.render(score_text, True, (0, 0, 0))
# 绘制出文字
screen.blit(score_surface, (10, 10))
在结束界面绘制文字
# 绘制分数
screen.blit(score_surface, (10, 10))
3、运行展示
五、提升游戏难度
1、说明
提升游戏难度有很多方法,在这里就不一一赘述,这里只作出示例,提取出若干参数,若提升游戏难度,只需将参数修改即可。另外多种玩法若有兴趣,读者可自行设定。
2、实现
添加全局变量
# 玩家射击速度
SHOOT_SPEED = 40
# 敌机增加速度
ENEMY_ADD_SPEED = 60
替换对应数据
if tick % SHOOT_SPEED == 0:
if tick % ENEMY_ADD_SPEED == 0:
六、总结
至此,所有功能基本完成,若再添加新功能,所用技术基本囊括在内,修改添加即可,本章不再赘述,下一篇将会进行全文总结,祝大家学习愉快!