首页IT科技python写魂斗罗(学习 Python 之 Pygame 开发魂斗罗(十))

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

时间2025-05-05 03:30:26分类IT科技浏览3887
导读:继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(九)中,我们让敌人能发射子弹,能移动,这次我们给敌人加上可以被消灭...

继续编写魂斗罗

在上次的博客学习 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 < len(self.images): self.image = self.images[self.index] self.index += 1 window.blit(self.image, self.rect) else: self.isDestroy = True self.index = 0 self.lastTime = currentTime else: window.blit(self.image, self.rect) else: # 根据索引获取爆炸对象, 添加到主窗口 # 让图像加载五次   ,这里可以换成五张大小不一样的爆炸图片            ,可以实现让爆炸效果从小变大的效果 if self.index < len(self.images): self.image = self.images[self.index] self.index += 1 window.blit(self.image, self.rect) else: self.isDestroy = True self.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 = True enemy.isDestroy = True explodeList.append(Explode(enemy))

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

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

接下来运行一下

ok               ,我们就实现了

声明:本站所有文章        ,如无特殊说明或标注      ,均为本站原创发布         。任何个人或组织                ,在未征得本站同意时          ,禁止复制            、盗用               、采集      、发布本站内容到任何网站         、书籍等各类媒体平台                  。如若本站内容侵犯了原著者的合法权益   ,可联系我们进行处理      。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
npm install 报错 汇总(【npm报错】解决invalid json response body at https://registry.npmjs.org)