学习 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,我们就实现了

相关内容

热门资讯

那一年诗歌 那一年诗歌那一年诗歌1  夜已经深了,黑夜不再会有璀璨的光  我知道  这颗星星离我一泓水的距离  ...
我们的现代诗歌 我们的现代诗歌  我们,  在一次次迷失中寻找自我,  在一次次绝望中重燃希望,  在一次次挫折中永...
形容女人消瘦的经典诗句 形容女人消瘦的经典诗句  衣带渐宽终不悔,为伊消得人憔悴。—柳永《凤栖梧》  二死生契阔,与子成说。...
收拢一季思绪抒情散文 收拢一季思绪抒情散文  念秋,朴实而又宁静;以冲淡了的心情,细数生活纹路,悟思;习惯结一段幽怨,不深...
描写大海景色的古诗句 描写大海景色的古诗句  白色的浪花,从遥远的大海深处涌向岸边。一浪高过一浪,后浪推前浪,这么美的景象...
描写好心情的诗句 描写好心情的诗句  水是眼波横白日放歌须纵酒,青春做伴好还乡  白云山头云欲立,白云山下呼声急,枯木...
相伴一生的唯美诗句 相伴一生的唯美诗句  在学习、工作乃至生活中,大家都接触过比较经典的诗句吧,诗句是诗的.句子,泛指诗...
鲁迅与胡适的爱恨情仇 鲁迅与胡适的爱恨情仇  近段时间,系统地读了些鲁迅与胡适的文集,以及介绍两位先生的传记文章。走进他们...
蝉的诗句 关于蝉的诗句  1、莫侵残日噪,正在异乡听。——五代楚·刘昭禹《闻蝉》  2、本以高难饱,徒劳恨费声...
春朱自清原文课文初一 春朱自清原文课文初一  朱自清的《春》,让你感到韵味无穷,百读不厌。下面随小编一起看看春朱自清原文课...
山城过雨百花尽,榕叶满庭莺乱... “山城过雨百花尽,榕叶满庭莺乱啼。”出处 出自 唐代 柳宗元 的《柳州二月榕叶落尽偶题》“山城过雨百...
叶嘉莹的《给孩子的古诗词》 叶嘉莹的《给孩子的古诗词》  去年九月,由叶嘉莹先生选编、张静老师协助整理的《给孩子的古诗词》付梓。...
白菡萏花三四枝 “白菡萏花三四枝”出处 出自 唐代 贯休 的《书石壁禅居屋壁》“白菡萏花三四枝”平仄韵脚 拼音:bá...
高楼送客不能醉,寂寂寒江明月... “高楼送客不能醉,寂寂寒江明月心。”出处 出自 唐代 王昌龄 的《芙蓉楼送辛渐二首》“高楼送客不能醉...
描写传统节日的古诗 描写传统节日的古诗  我国的传统节日有很多,那么古人又是如何描写这些传统的节日的呢?下面是应届毕业生...
朱自清《匆匆》读后感400字 朱自清《匆匆》读后感400字  《匆匆》这篇文章主要是讲让人们珍惜时光,发奋向上,有所作为。字字句句...
抒发心情惆怅的诗句是 抒发心情惆怅的诗句是  很久前,那个你我邂逅的'地点,总是幸欢乐漫天,为何如今,再回去却惆怅遍布了空...
儿童的诗句 关于儿童的诗句大全  在日复一日的学习、工作或生活中,大家一定没少看到经典的`诗句吧,诗句节奏上鲜明...
李白写的中秋节的古诗 李白写的中秋节的古诗  古诗是中华文化的.典型代表,陶冶情操,丰富知识,腹有诗书气自华的人是多么的招...
关于春草的诗句 小编今天推荐给大家的是关于春草的诗句,仅供参考,希望对大家有用。关注unjs网获得更多内容。关于春草...