学习 Python 之 Pygame 开发魂斗罗(十)
创始人
2024-05-30 19:39:04
0

学习 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 = 1BRIDGE = 2

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

下面这个是桥爆炸的特效

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

class Explode:def __init__(self, object, variety = ExplodeVariety.CIRCLE, isUseTime = False):# 获取爆炸对象的位置self.rect = object.rectif 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 = 0self.image = self.images[self.index]self.isDestroy = Falseself.isUseTime = isUseTimeself.lastTime = Nonedef draw(self, window, currentTime = None):if self.isUseTime:if currentTime - self.lastTime > 115:# 根据索引获取爆炸对象, 添加到主窗口# 让图像加载五次,这里可以换成五张大小不一样的爆炸图片,可以实现让爆炸效果从小变大的效果if self.index < len(self.images):self.image = self.images[self.index]self.index += 1window.blit(self.image, self.rect)else:self.isDestroy = Trueself.index = 0self.lastTime = currentTimeelse:window.blit(self.image, self.rect)else:# 根据索引获取爆炸对象, 添加到主窗口# 让图像加载五次,这里可以换成五张大小不一样的爆炸图片,可以实现让爆炸效果从小变大的效果if self.index < len(self.images):self.image = self.images[self.index]self.index += 1window.blit(self.image, self.rect)else:self.isDestroy = Trueself.index = 0

每种爆炸效果是多张图片,为了让爆炸效果的显示的顺畅一点,我给敌人死亡的爆炸效果多加入了几张重复的图片,这样运行起来爆炸效果比较好,当然也可以使用帧率来控制

桥的爆炸效果我用的帧率来控制,所以有个变量isUseTime,如果是True,表示用游戏中的时间来控制图片的加载

3. 为敌人跳入河中增加爆炸效果

首先,在主类中增加爆炸效果列表

在这里插入图片描述
其次,创建显示爆炸效果函数

def drawExplode(explodeList):for explode in explodeList:if explode.isDestroy:explodeList.remove(explode)else:if explode.isUseTime:explode.draw(MainGame.window, pygame.time.get_ticks())else:explode.draw(MainGame.window)

这里由于isUseTime为True时,draw()函数需要多传入一个参数,所以要写if-else语句

最后,在主类中调用显示爆炸特效函数和给敌人加入爆炸特效

在这里插入图片描述
给敌人进入河中加入爆炸特效
在这里插入图片描述
接下来我们运行一下游戏,看看效果

在这里插入图片描述
发现敌人落到河里就爆炸啦

4. 玩家击中敌人

下面给添加玩家子弹击中敌人,敌人死亡

进入子弹类,添加函数

def collideEnemy(self, enemyList, explodeList):for enemy in enemyList:if pygame.sprite.collide_rect(self, enemy):self.isDestroy = Trueenemy.isDestroy = TrueexplodeList.append(Explode(enemy))

遍历敌人列表,如果当前的子弹碰到了敌人,那么就加入爆炸特效,让敌人的isDestroy为True

然后在主类的drawPlayerOneBullet()函数中,调用函数

在这里插入图片描述
接下来运行一下

在这里插入图片描述
ok,我们就实现了

相关内容

热门资讯

勤俭节约的标语 勤俭节约的标语(精选125句)  在日复一日的学习、工作或生活中,大家都不可避免地会接触到标语吧,标...
描述国防教育的口号 描述国防教育的口号大全  1、筑钢铁长城,保华夏久安。  2、致富不忘国防,和平不忘忧患。  3、战...
工厂安全生产的标语 工厂安全生产的标语(精选140句)  在日常学习、工作或生活中,大家总免不了要接触或使用标语吧,标语...
节约用电标语 节约用电标语(通用50句)  在平平淡淡的日常中,大家最不陌生的就是标语了吧,标语肩负着“社教”的使...
语言文字普通话宣传的标语 语言文字普通话宣传的标语(精选180句)  在生活、工作和学习中,说到标语,大家肯定都不陌生吧,借助...
爱牙护牙的宣传标语 爱牙护牙的宣传标语  牙齿看似坚固,更加需要需要你细心地呵护,爱牙的日子不只是今天,而是生活的每一天...
淘宝包包评价语 淘宝包包评价语  淘宝网是亚太地区较大网络零售、商圈,由阿里巴巴集团在2003年5月创立。淘宝网是中...
美好家园的标语 美好家园的标语集锦  在日常学习、工作或生活中,大家一定没少看到过标语吧,标语的作用是便于“造势”,...
图书室标语 图书室标语(精选170句)  图书室是提高学生综合素质和学校办学品位的重要载体,接下来小编搜集了图书...
战狼团队的口号 战狼团队的口号(精选120句)  在现实生活或工作学习中,大家肯定对各类口号都很熟悉吧,口号往往带有...
卫生间广告标语 卫生间广告标语  在平平淡淡的日常中,大家一定没少看到过标语吧,标语具有文字简练、意义鲜明的特点。什...
森林防火宣传标语 森林防火宣传标语(精选120句)  在我们平凡的日常里,大家肯定对各类标语都很熟悉吧,标语具有文字简...
运动会横幅标语 运动会横幅标语汇总  在日常的学习、工作、生活中,大家都有令自己印象深刻的标语吧,通过标语,可以增强...
经典广告语 精选经典广告语大全  1. 七白荟萃,美白天成 佰草集  2. 凉爽洁净 细致清新 富顶  3. 轻...
部门主管领导评语 部门主管领导评语  在日常学习、工作和生活中,要用到评语的地方还是很多的,不断地改进提高。那么问题来...
生活中有趣的广告语 生活中有趣的广告语(精选60句)  广告语,又称广告词,广义的广告语指通过各种传播媒体和招贴形式向公...
开学迎新海报标语 开学迎新海报标语  无论是身处学校还是步入社会,大家一定没少看到过标语吧,标语具有在理智上启发人们,...
对同学的评语 对同学的评语(精选220句)  在日常生活或是工作学习中,大家都写过评语吧,评语可以对被评价者进行有...
运动会口号押韵有气势 运动会口号押韵有气势  运动会的意义  运动会不仅丰富了员工的业余生活,还促进了大家相互间的交流,增...
垃圾分类垃圾桶标语 垃圾分类垃圾桶标语(精选190句)  在日复一日的学习、工作或生活中,大家都对那些朗朗上口的标语很是...