学习 Python 之 Pygame 开发魂斗罗(八) 您所在的位置:网站首页 pygame作用 学习 Python 之 Pygame 开发魂斗罗(八)

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

#学习 Python 之 Pygame 开发魂斗罗(八)| 来源: 网络整理| 查看: 265

学习 Python 之 Pygame 开发魂斗罗(八) 继续编写魂斗罗 1. 创建敌人类 2. 增加敌人移动和显示函数 3. 敌人开火 4. 修改主函数 5. 产生敌人 6. 使敌人移动

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

下面是图片的素材

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

1. 创建敌人类import random import pygame from Constants import * from Bullet import Bullet class Enemy1(pygame.sprite.Sprite): def __init__(self, x, y, direction, currentTime): pygame.sprite.Sprite.__init__(self) self.lastTime = currentTime self.fireTime = currentTime self.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 = direction if 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 = False self.rect.x = x self.rect.y = y self.speed = 3 self.isDestroy = False self.isFiring = False self.life = 1

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

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

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

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

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

def draw(self, currentTime): if self.isFiring: if self.direction == Direction.RIGHT: self.image = self.rightFireImage else: self.image = self.leftFireImage else: if currentTime - self.lastTime > 115: if self.index 1000: self.isDestroy = True elif 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 = True enemyBulletList.append(Bullet(self, True))

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

完整敌人1类代码

import random import pygame from Constants import * from Bullet import Bullet class Enemy1(pygame.sprite.Sprite): def __init__(self, x, y, direction, currentTime): pygame.sprite.Sprite.__init__(self) self.lastTime = currentTime self.fireTime = currentTime self.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 = direction if 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 = False self.rect.x = x self.rect.y = y self.speed = 3 self.isDestroy = False self.isFiring = False self.life = 1 def move(self, currentTime): # 首先判断敌人是否开火,如果是开火状态,就不能移动 if not self.isFiring: # 没有开火,就根据方向移动,这里我设置敌人只能向一个方向移动,不能转身 if self.direction == Direction.RIGHT: self.rect.left += self.speed else: self.rect.left -= self.speed else: # 如果此时是开火状态,判断一下上次开火的时间和这次的时间是否相差1000 # 这个的作用在于让敌人开火的时候站在那里不动,因为敌人移动时是不能开火的 if currentTime - self.fireTime > 1000: # 如果两次开火间隔相差很大,那么就可以让敌人再次开火 self.isFiring = False self.fireTime = currentTime def draw(self, currentTime): if self.isFiring: if self.direction == Direction.RIGHT: self.image = self.rightFireImage else: self.image = self.leftFireImage else: if currentTime - self.lastTime > 115: if self.index 1000: self.isDestroy = True elif 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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

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