学习 Python 之 Pygame 开发魂斗罗(十) 您所在的位置:网站首页 python之pygame模块实现飞机大战完整代码 学习 Python 之 Pygame 开发魂斗罗(十)

学习 Python 之 Pygame 开发魂斗罗(十)

2023-03-11 20:14| 来源: 网络整理| 查看: 265

学习 Python 之 Pygame 开发魂斗罗(十) 继续编写魂斗罗1. 解决敌人不开火的问题2. 创建爆炸效果类3. 为敌人跳入河中增加爆炸效果4. 玩家击中敌人

继续编写魂斗罗

在上次的博客学习 Python 之 Pygame 开发魂斗罗(九)中,我们让敌人能发射子弹,能移动,这次我们给敌人加上可以被消灭

下面是图片的素材

链接:https://pan.baidu.com/s/1X7tESkes_O6nbPxfpHD6hQ?pwd=hdly 提取码:hdly

1. 解决敌人不开火的问题

不知道为什么,我这次运行代码,发现敌人一直不开火,如果你也遇到了,来看看如何解决吧

在这里插入图片描述 当我们运行游戏后,出现了敌人不开火的问题,我们进入敌人1类的fire()函数 在这里插入图片描述

加入一行代码,看看是否能进入开火的条件 在这里插入图片描述 运行游戏后发现,这个变量一直是True,所以无法进入下面的if语句

在这里插入图片描述 我们看看,哪里修改了这个变量

在这里插入图片描述 我们找到,修改变量值的地方在主类的updateEnemyPosition()函数中

当敌人进行垂直碰撞检测时,如果敌人脚下没有碰撞体,那么就判定敌人是下落状态,于是敌人的isFalling变量为True了,但是如果敌人脚下有碰撞体,我们应该把isFalling变成True,不然敌人就一直处于下落状态,那么就永远不会开火了

所以,我们加入下方的代码,这样问题就解决了

在这里插入图片描述 我们要想一想,为什么敌人会处于下落状态,敌人出来后并没有到达悬崖边,那么是如何处于下落状态的呢?

原来是我们产生敌人的位置距离下方的碰撞体有几个像素,当敌人产生后,下方距离碰撞体有点距离,所以就变了下落状态,又因为陆地碰撞体敌人碰到后不会死亡,所以敌人就会出现不会开火的情况

这个问题解决后,下面我们来写子弹击中敌人

2. 创建爆炸效果类

敌人死亡时,会有爆炸特效,所以我们要先创建爆炸效果类,然后才能写敌人死亡的逻辑

首先,在Constants.py中加入爆炸效果的类型,在魂斗罗中,第一关桥也会爆炸,BOSS死亡后也会爆炸,敌人死亡也会爆炸,但是他们的爆炸特效不一样,所以我们要加入一个枚举类,用来枚举出各种爆炸效果

class ExplodeVariety(Enum): CIRCLE = 1 BRIDGE = 2

在这里插入图片描述 这里说明了两种爆炸效果,一种是敌人死亡的圆圈爆炸,还有一种是桥的爆炸

下面这个是桥爆炸的特效

在这里插入图片描述 下面是敌人死亡的特效 在这里插入图片描述 接下来就可以创建爆炸效果类了

class Explode: def __init__(self, object, variety = ExplodeVariety.CIRCLE, isUseTime = False): # 获取爆炸对象的位置 self.rect = object.rect if variety == ExplodeVariety.CIRCLE: self.images = [ loadImage('../Image/Explode/circleExplode1.png'), loadImage('../Image/Explode/circleExplode1.png'), loadImage('../Image/Explode/circleExplode1.png'), loadImage('../Image/Explode/circleExplode1.png'), loadImage('../Image/Explode/circleExplode2.png'), loadImage('../Image/Explode/circleExplode2.png'), loadImage('../Image/Explode/circleExplode2.png'), loadImage('../Image/Explode/circleExplode2.png'), loadImage('../Image/Explode/circleExplode3.png'), loadImage('../Image/Explode/circleExplode3.png'), loadImage('../Image/Explode/circleExplode3.png'), loadImage('../Image/Explode/circleExplode3.png'), ] elif variety == ExplodeVariety.BRIDGE: self.images = [ loadImage('../Image/Explode/bridgeExplode1.png'), loadImage('../Image/Explode/bridgeExplode2.png'), loadImage('../Image/Explode/bridgeExplode3.png'), ] self.index = 0 self.image = self.images[self.index] self.isDestroy = False self.isUseTime = isUseTime self.lastTime = None def draw(self, window, currentTime = None): if self.isUseTime: if currentTime - self.lastTime > 115: # 根据索引获取爆炸对象, 添加到主窗口 # 让图像加载五次,这里可以换成五张大小不一样的爆炸图片,可以实现让爆炸效果从小变大的效果 if self.index


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有