python小游戏——飞机大战(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:

六、总结

至此,所有功能基本完成,若再添加新功能,所用技术基本囊括在内,修改添加即可,本章不再赘述,下一篇将会进行全文总结,祝大家学习愉快!

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值