当前位置: 首页 > news >正文

中小学智慧校园建设平台网站郑州网络推广专业公司

中小学智慧校园建设平台网站,郑州网络推广专业公司,精品在线开发网站建设,京东网上商城女装学习 Python 之 Pygame 开发魂斗罗(八)继续编写魂斗罗1. 创建敌人类2. 增加敌人移动和显示函数3. 敌人开火4. 修改主函数5. 产生敌人6. 使敌人移动继续编写魂斗罗 在上次的博客学习 Python 之 Pygame 开发魂斗罗(七)中&#xff0…

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

    • 继续编写魂斗罗
      • 1. 创建敌人类
      • 2. 增加敌人移动和显示函数
      • 3. 敌人开火
      • 4. 修改主函数
      • 5. 产生敌人
      • 6. 使敌人移动

继续编写魂斗罗

在上次的博客学习 Python 之 Pygame 开发魂斗罗(七)中,我们解决了一些问题,这次我们加入敌人

下面是图片的素材

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

1. 创建敌人类

import randomimport pygame
from Constants import *
from Bullet import Bulletclass Enemy1(pygame.sprite.Sprite):def __init__(self, x, y, direction, currentTime):pygame.sprite.Sprite.__init__(self)self.lastTime = currentTimeself.fireTime = currentTimeself.rightImages = [loadImage('../Image/Enemy/Enemy1/1.png'),loadImage('../Image/Enemy/Enemy1/2.png'),loadImage('../Image/Enemy/Enemy1/3.png')]self.leftImages = [loadImage('../Image/Enemy/Enemy1/1.png', True),loadImage('../Image/Enemy/Enemy1/2.png', True),loadImage('../Image/Enemy/Enemy1/3.png', True)]self.rightFireImage = loadImage('../Image/Enemy/Enemy1/fire.png')self.leftFireImage = loadImage('../Image/Enemy/Enemy1/fire.png', True)self.fallImage = loadImage('../Image/Enemy/Enemy1/fall.png', True)# 图片下标self.index = 0# 方向self.direction = directionif self.direction == Direction.RIGHT:self.image = self.rightImages[self.index]else:self.image = self.leftImages[self.index]self.rect = self.image.get_rect()self.isFalling = Falseself.rect.x = xself.rect.y = yself.speed = 3self.isDestroy = Falseself.isFiring = Falseself.life = 1

这里敌人的移动也是三幅图片,加载时需要连续显示这三张图片

2. 增加敌人移动和显示函数

def move(self, currentTime):# 首先判断敌人是否开火,如果是开火状态,就不能移动if not self.isFiring:# 没有开火,就根据方向移动,这里我设置敌人只能向一个方向移动,不能转身if self.direction == Direction.RIGHT:self.rect.left += self.speedelse:self.rect.left -= self.speedelse:# 如果此时是开火状态,判断一下上次开火的时间和这次的时间是否相差1000# 这个的作用在于让敌人开火的时候站在那里不动,因为敌人移动时是不能开火的if currentTime - self.fireTime > 1000:# 如果两次开火间隔相差很大,那么就可以让敌人再次开火self.isFiring = Falseself.fireTime = currentTime

这里主要是解决敌人开火不能移动的问题

因为敌人开火是站着不动,如果两次开火间隔比较短,敌人频繁开火,运行游戏后会出现敌人移动就能发射子弹的情况

下面是显示函数,这个跟玩家的显示函数差不多

def draw(self, currentTime):if self.isFiring:if self.direction == Direction.RIGHT:self.image = self.rightFireImageelse:self.image = self.leftFireImageelse:if currentTime - self.lastTime > 115:if self.index < 2:self.index += 1else:self.index = 0self.lastTime = currentTimeif self.direction == Direction.RIGHT:self.image = self.rightImages[self.index]else:self.image = self.leftImages[self.index]

有了移动函数,就要对敌人位置进行检测,当玩家距离敌人1000像素之外后,敌人就会自动消失了,用来防止敌人过多卡

    def checkPosition(self, x, y):if abs(self.rect.x - x) > 1000:self.isDestroy = Trueelif abs(self.rect.y - y) > 600:self.isDestroy = True

水平相距1000像素后消失,垂直相距600像素后消失

3. 敌人开火

def fire(self, enemyBulletList):if not self.isFalling:i = random.randint(0, 50)if i == 5:if not self.isFiring:self.isFiring = TrueenemyBulletList.append(Bullet(self, True))

这个函数设置了,当敌人处于下落状态时,不能开火
开火是随机的,随机从0到50产生一个数字,如果是5,敌人就开火

完整敌人1类代码

import randomimport pygame
from Constants import *
from Bullet import Bulletclass Enemy1(pygame.sprite.Sprite):def __init__(self, x, y, direction, currentTime):pygame.sprite.Sprite.__init__(self)self.lastTime = currentTimeself.fireTime = currentTimeself.rightImages = [loadImage('../Image/Enemy/Enemy1/1.png'),loadImage('../Image/Enemy/Enemy1/2.png'),loadImage('../Image/Enemy/Enemy1/3.png')]self.leftImages = [loadImage('../Image/Enemy/Enemy1/1.png', True),loadImage('../Image/Enemy/Enemy1/2.png', True),loadImage('../Image/Enemy/Enemy1/3.png', True)]self.rightFireImage = loadImage('../Image/Enemy/Enemy1/fire.png')self.leftFireImage = loadImage('../Image/Enemy/Enemy1/fire.png', True)self.fallImage = loadImage('../Image/Enemy/Enemy1/fall.png', True)self.index = 0self.direction = directionif self.direction == Direction.RIGHT:self.image = self.rightImages[self.index]else:self.image = self.leftImages[self.index]self.rect = self.image.get_rect()self.isFalling = Falseself.rect.x = xself.rect.y = yself.speed = 3self.isDestroy = Falseself.isFiring = Falseself.life = 1def move(self, currentTime):# 首先判断敌人是否开火,如果是开火状态,就不能移动if not self.isFiring:# 没有开火,就根据方向移动,这里我设置敌人只能向一个方向移动,不能转身if self.direction == Direction.RIGHT:self.rect.left += self.speedelse:self.rect.left -= self.speedelse:# 如果此时是开火状态,判断一下上次开火的时间和这次的时间是否相差1000# 这个的作用在于让敌人开火的时候站在那里不动,因为敌人移动时是不能开火的if currentTime - self.fireTime > 1000:# 如果两次开火间隔相差很大,那么就可以让敌人再次开火self.isFiring = Falseself.fireTime = currentTimedef draw(self, currentTime):if self.isFiring:if self.direction == Direction.RIGHT:self.image = self.rightFireImageelse:self.image = self.leftFireImageelse:if currentTime - self.lastTime > 115:if self.index < 2:self.index += 1else:self.index = 0self.lastTime = currentTimeif self.direction == Direction.RIGHT:self.image = self.rightImages[self.index]else:self.image = self.leftImages[self.index]def fire(self, enemyBulletList):if not self.isFalling:i = random.randint(0, 50)if i == 5:if not self.isFiring:self.isFiring = TrueenemyBulletList.append(Bullet(self, True))def checkPosition(self, x, y):if abs(self.rect.x - x) > 1000:self.isDestroy = Trueelif abs(self.rect.y - y) > 600:self.isDestroy = True

由于每个敌人的图片不一样,我就分开创建敌人类,这个是敌人1类,新加入敌人就创建新的敌人类

4. 修改主函数

由于加入了敌人类,主函数的碰撞体组需要进行改变

敌人和玩家的碰撞体应该分开,因为玩家向下跳的时候,上面的碰撞体会消失,如果此时有敌人在上面,碰撞体一消失,敌人就会掉下来,这是不对的,所以我们要修改原有的碰撞体组
在这里插入图片描述
把上图的红框中的代码修改成下面的样子

如果使用Pycharm软件,我们按住ctrl+R,一键替换
在这里插入图片描述
然后就换完了
在这里插入图片描述
全部还完后的结果

在这里插入图片描述

# 冲突
playerLandGroup = pygame.sprite.Group()
playerColliderGroup = pygame.sprite.Group()
playerRiverGroup = pygame.sprite.Group()

现在完成了玩家的碰撞体组

当敌人加入后,就要创建敌人的碰撞体组

playerLandGroup = pygame.sprite.Group()
playerRiverGroup = pygame.sprite.Group()
enemyLandGroup = pygame.sprite.Group()
enemyRiverGroup = pygame.sprite.Group()
playerColliderGroup = pygame.sprite.Group()
enemyColliderGroup = pygame.sprite.Group()
enemyGroup = pygame.sprite.Group()
bridgeGroup = pygame.sprite.Group()

这是最后的碰撞体组

有敌人的也有玩家的

在原版魂斗罗中,第一关是有桥的,当玩家走上去后,就会爆炸,所以这里有桥的碰撞体组

接下来加入敌人列表

# 敌人
enemyList = []

在这里插入图片描述

用来把存放游戏中当前的敌人

5. 产生敌人

好的,接下来我们来写创建敌人的函数

def generateEnemy(self, x, y, direction, currentTime):enemy = Enemy1(x, y, direction, currentTime)MainGame.enemyList.append(enemy)MainGame.allSprites.add(enemy)MainGame.enemyGroup.add(enemy)

在update()函数中,我们调用这个函数

# 加载敌人
if -1505 < self.backRect.x < -1500:self.generateEnemy(MainGame.player1.rect.x + 600, POSITION_1, Direction.LEFT, pygame.time.get_ticks())self.generateEnemy(MainGame.player1.rect.x - 360, POSITION_1, Direction.RIGHT, pygame.time.get_ticks())if -1705 < self.backRect.x < -1700:self.generateEnemy(MainGame.player1.rect.x - 360, POSITION_1, Direction.RIGHT, pygame.time.get_ticks())self.generateEnemy(MainGame.player1.rect.x - 400, POSITION_1, Direction.RIGHT,pygame.time.get_ticks())

这个代码的意思是,当背景加载到-1505到-1500时,就会在玩家前方和后方产生两个敌人

同理,在-1705到-1700时,也会产生两个敌人
在这里插入图片描述
在Constants.py中加入下面这个

POSITION_1 = 233

这个表示敌人产生的位置的y坐标,位置如下图
在这里插入图片描述
就是在当前玩家所站的这个平台上,产生敌人,如果按照玩家的位置产生敌人,当玩家跳跃时,敌人可能在空中产生

下面我们运行一下,看看敌人有没有出现

在这里插入图片描述

敌人出现了,但是没有移动,这是为什么?

因为没有调用敌人的move()函数让敌人移动

6. 使敌人移动

下面我们创建敌人更新函数

def enemyUpdate(enemyList, enemyBulletList):# 遍历整个敌人列表for enemy in enemyList:# 如果敌人已经被摧毁了if enemy.isDestroy:# 删除它的相关信息enemyList.remove(enemy)MainGame.allSprites.remove(enemy)MainGame.enemyGroup.remove(enemy)# 否则else:# 检查位置enemy.checkPosition(MainGame.player1.rect.x, MainGame.player1.rect.y)# 显示敌人enemy.draw(pygame.time.get_ticks())# 敌人移动enemy.move(pygame.time.get_ticks())# 敌人开火enemy.fire(enemyBulletList)

这里的有一个参数是敌人子弹列表,我们在主类中也创建一下

在这里插入图片描述

下面我们调用一下这个函数

在这里插入图片描述
之后我们再运行一下游戏,看看效果

出现了问题

在这里插入图片描述
我们把敌人1类的fire函数开火代码注释一下

在这里插入图片描述
出现错误的原因是:敌人开火的位置和玩家开火的位置不一样,所有我们要在子弹类的构造函数中加入一个变量,用来指定当前子弹是敌人子弹还是玩家子弹,这里因为我们还没有来得及修改子弹类的代码,所有会出错误,以后会进行修改的,现在先看看敌人能不能加载出来

在这里插入图片描述
到这里,我们就可以可能敌人出来啦
在这里插入图片描述
但是我们看到敌人不会向下掉落,这是因为没有给敌人增加碰撞体,接下来我们先实现敌人发射子弹,然后再实现敌人碰撞体的问题


文章转载自:
http://bsb.tzmc.cn
http://aecidium.tzmc.cn
http://broadcaster.tzmc.cn
http://exemplary.tzmc.cn
http://clavicular.tzmc.cn
http://courteous.tzmc.cn
http://shy.tzmc.cn
http://flory.tzmc.cn
http://tergiversate.tzmc.cn
http://deputy.tzmc.cn
http://mythopoeia.tzmc.cn
http://transcend.tzmc.cn
http://maintopsail.tzmc.cn
http://heritress.tzmc.cn
http://weaver.tzmc.cn
http://incautious.tzmc.cn
http://gybe.tzmc.cn
http://divertingness.tzmc.cn
http://saipan.tzmc.cn
http://rhodopsin.tzmc.cn
http://astarboard.tzmc.cn
http://repot.tzmc.cn
http://sinicism.tzmc.cn
http://comparably.tzmc.cn
http://chasse.tzmc.cn
http://queer.tzmc.cn
http://eternise.tzmc.cn
http://fulvia.tzmc.cn
http://barky.tzmc.cn
http://instruct.tzmc.cn
http://suborbital.tzmc.cn
http://athanasian.tzmc.cn
http://catholicate.tzmc.cn
http://ecpc.tzmc.cn
http://colatitude.tzmc.cn
http://galluses.tzmc.cn
http://ectoplasm.tzmc.cn
http://psychoanalyze.tzmc.cn
http://coyotillo.tzmc.cn
http://impersonalization.tzmc.cn
http://tridione.tzmc.cn
http://flectional.tzmc.cn
http://wavily.tzmc.cn
http://haubergeon.tzmc.cn
http://kenya.tzmc.cn
http://waterwheel.tzmc.cn
http://transfluxor.tzmc.cn
http://lyons.tzmc.cn
http://extinguisher.tzmc.cn
http://embargo.tzmc.cn
http://barbarity.tzmc.cn
http://jazzy.tzmc.cn
http://enrollment.tzmc.cn
http://outfly.tzmc.cn
http://chainman.tzmc.cn
http://wampum.tzmc.cn
http://fissiparism.tzmc.cn
http://briskly.tzmc.cn
http://kurta.tzmc.cn
http://lanolated.tzmc.cn
http://brawly.tzmc.cn
http://knowledge.tzmc.cn
http://exogamy.tzmc.cn
http://onrushing.tzmc.cn
http://fief.tzmc.cn
http://titan.tzmc.cn
http://creditability.tzmc.cn
http://blowtube.tzmc.cn
http://endosteum.tzmc.cn
http://antibiotic.tzmc.cn
http://tritural.tzmc.cn
http://gyration.tzmc.cn
http://brightwork.tzmc.cn
http://plainsong.tzmc.cn
http://old.tzmc.cn
http://repetitiousness.tzmc.cn
http://salvable.tzmc.cn
http://corresponsive.tzmc.cn
http://quadrupole.tzmc.cn
http://milimeter.tzmc.cn
http://mrna.tzmc.cn
http://butchery.tzmc.cn
http://dilutor.tzmc.cn
http://harbin.tzmc.cn
http://coke.tzmc.cn
http://siff.tzmc.cn
http://powerfully.tzmc.cn
http://porcellaneous.tzmc.cn
http://gaolbird.tzmc.cn
http://weed.tzmc.cn
http://poe.tzmc.cn
http://uncondescending.tzmc.cn
http://reaper.tzmc.cn
http://chromatolytic.tzmc.cn
http://unheeded.tzmc.cn
http://xeromorphic.tzmc.cn
http://treadless.tzmc.cn
http://criminalist.tzmc.cn
http://sorel.tzmc.cn
http://birman.tzmc.cn
http://www.dt0577.cn/news/99689.html

相关文章:

  • 怎么做百度推广平台seo信息是什么
  • 做信息网站怎么赚钱日本积分榜最新排名
  • 北京二次感染最新消息河南seo优化
  • 设计癖官网游戏行业seo整站优化
  • 网站建设yu宁波正规seo推广公司
  • 网站建设吉金手指排名11青岛seo网站排名
  • 公司logo在线设计生成器太原seo快速排名怎么样
  • 南山区网站建设公司优化网站关键词的技巧
  • 网站不用域名可以吗设计网站
  • 广联达工程造价软件官网快速排名优化推广排名
  • 网络营销类网站东莞seo建站公司
  • 今日头条网站模板网站统计系统
  • 小程序模板平台有哪些seo优化顾问服务
  • 网站建设开发用什么软件win10必做的优化
  • 郑州做网站华久科技中国万网域名注册服务内容
  • 北京做网站开发公司电话周口seo推广
  • 深圳手机微商网站设计联系电话本周国内重大新闻十条
  • 机械加工网站色彩搭配个人外包接单平台
  • 平面设计接单平台哪个靠谱点百度快速seo
  • 河南省汝州市文明建设网站nba最新排行榜
  • 成都维尼网络 网站建设有效果的网站排名
  • b2b 网站系统百度竞价推广托管
  • 乌云网是个什么网站上海已经开始二次感染了
  • 装修公司网站wordpress 模板关键词排名查询软件
  • 营销网络世界地图惠州seo外包
  • 上海公司注册代办费用站长工具seo综合查询怎么关闭
  • 江苏省建设工程备案网站白云区新闻
  • wordpress福利苏州seo优化
  • 企业标志成都网站优化
  • 扬州有做义工的地方或网站嘛百度在线识别图片