pygame--坦克大战(三)

我方坦克发射子弹

添加显示子弹

class Bullet:
  '''
   子弹类
   '''    
  def display_bullet(self) -> None:
    '''
     显示子弹
     '''
    MainGame.window.blit(self.image,self.rect)

按空格键产生子弹,并将子弹添加到子弹列表中

class MainGame:
  '''
   游戏主窗口类
   '''
  # 游戏主窗口对象
  window =None
  # 设置我放坦克
  my_tank = None
  # 存储敌方坦克的列表
  enemy_tank_list = []
  # 设置敌方坦克的数量
  enemy_tank_count = 6
  # 存储我方子弹的列表
  my_bullet_list = []
    def get_event(self) -> None:
    '''
     获取事件
     '''
    # 获取所有事件
    event_list = pygame.event.get() 
    # 遍历事件
    for event in event_list:
      # 判断是什么事件,然后做出相应的处理
      if event.type == pygame.QUIT:
        # 点击关闭按钮
        self.end_game()
      if event.type == pygame.KEYDOWN:
        # 按下键盘
        if event.key == pygame.K_LEFT:
          print('坦克向左移动')
          # 修改方向
          MainGame.my_tank.direction = 'L'
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_RIGHT:
          print('坦克向右移动')
          # 修改方向
          MainGame.my_tank.direction = 'R'  
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_UP:
          print('坦克向上移动')
          # 修改方向
          MainGame.my_tank.direction = 'U'
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_DOWN:
          # 修改方向
          MainGame.my_tank.direction = 'D'
          print('坦克向下移动')
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_SPACE:
          # 发射子弹
          print('发射子弹')
          # 创建子弹
          m_bullet = Bullet(MainGame.my_tank)
          # 将子弹添加到列表中
          MainGame.my_bullet_list.append(m_bullet)


      if event.type == pygame.KEYUP and event.key in (pygame.K_LEFT,pygame.K_RIGHT,pygame.K_UP,pygame.K_DOWN):
        # 修改坦克移动的状态  
        MainGame.my_tank.remove = False


将子弹添加到窗口

 def start_game(self) -> None:
    '''
     开始游戏
     '''
    # 初始化游戏窗口
    pygame.display.init()
    # 创建一个窗口
    MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
    # 设置窗口标题
    pygame.display.set_caption('坦克大战1.0')
    # 创建一个我方 坦克
    MainGame.my_tank = MyTank(350,200)
    # 创建敌方坦克
    self.create_enemy_tank()
    # 刷新窗口
    while True:
      sleep(0.02)
      # 给窗口设置填充色
      MainGame.window.fill(BG_COLOR)
      # 增加提示文字
      # 1.要增加文字内容
      # num = 6
      text = self.get_text_surface(f'敌方坦克剩余数量{MainGame.enemy_tank_count}')
      # 2.如何把文字加上
      MainGame.window.blit(text,(10,10))
      # 增加事件
      self.get_event()
      # 显示 我方坦克
      MainGame.my_tank.display_tank()
      # 显示敌方坦克
      self.display_enemy_tank()
      # 移动坦克
      if MainGame.my_tank.remove:
        MainGame.my_tank.move()
      # 显示我方子弹
      self.display_my_bullet()
      pygame.display.update()

我方子弹移动

  #子弹的移动方法
   def move(self) -> None:
    '''
     子弹的移动
     '''
    # 根据子弹生成的方向来的移动
    if self.direction == "L":
      # 判断子弹是否超出屏幕
      if self.rect.left > 0:
        self.rect.left -= self.speed
    elif self.direction == "R":
      # 判断子弹是否超出屏幕
      if self.rect.left + self.rect.width < SCREEN_WIDTH:
        self.rect.left += self.speed
    elif self.direction == "U":
      # 判断子弹是否超出屏幕
      if self.rect.top > 0:
        self.rect.top -= self.speed
    elif self.direction == "D":
      # 判断子弹是否超出屏幕
      if self.rect.top + self.rect.height < SCREEN_HEIGHT:
        self.rect.top += self.speed

修改MainGame类,显示子弹方法

  def display_my_bullet(self) -> None:
    '''
     显示我方子弹
     '''
    for my_bullet in MainGame.my_bullet_list:
      # 显示我方子弹
      my_bullet.display_bullet()
      # 移动我方子弹
      my_bullet.move()

子弹的消亡与数量控制

修改子弹类,创建live属性,与根据移动位置修改live状态

class Bullet:
  '''
   子弹类
   '''
  def __init__(self,tank) -> None:
    # 设置子弹的状态
    self.live = True


  def move(self) -> None:
    '''
     子弹的移动
     '''
    # 根据子弹生成的方向来的移动
    if self.direction == "L":
      # 判断子弹是否超出屏幕
      if self.rect.left > 0:
        self.rect.left -= self.speed
      else:
        self.live = False
    elif self.direction == "R":
      # 判断子弹是否超出屏幕
      if self.rect.left + self.rect.width < SCREEN_WIDTH:
        self.rect.left += self.speed
      else:
        self.live = False
    elif self.direction == "U":
      # 判断子弹是否超出屏幕
      if self.rect.top > 0:
        self.rect.top -= self.speed
      else:
        self.live = False
    elif self.direction == "D":
      # 判断子弹是否超出屏幕
      if self.rect.top + self.rect.height < SCREEN_HEIGHT:
        self.rect.top += self.speed
      else:
        self.live = False

修改MainGame类,修改显示子弹类,与事件监听

def display_my_bullet(self) -> None:
  '''
     显示我方子弹
     '''
  for my_bullet in MainGame.my_bullet_list:
    # 判断子弹是否存活
    if my_bullet.live:
      # 显示我方子弹
      my_bullet.display_bullet()
      # 移动我方子弹
      my_bullet.move()
    else:
      # 从列表中移除
      MainGame.my_bullet_list.remove(my_bullet)


def get_event(self) -> None:
    '''
     获取事件
     '''
    # 获取所有事件
    event_list = pygame.event.get() 
    # 遍历事件
    for event in event_list:
      # 判断是什么事件,然后做出相应的处理
      if event.type == pygame.QUIT:
        # 点击关闭按钮
        self.end_game()
      if event.type == pygame.KEYDOWN:
        # 按下键盘
        if event.key == pygame.K_LEFT:
          print('坦克向左移动')
          # 修改方向
          MainGame.my_tank.direction = 'L'
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_RIGHT:
          print('坦克向右移动')
          # 修改方向
          MainGame.my_tank.direction = 'R'  
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_UP:
          print('坦克向上移动')
          # 修改方向
          MainGame.my_tank.direction = 'U'
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_DOWN:
          # 修改方向
          MainGame.my_tank.direction = 'D'
          print('坦克向下移动')
          # 修改坦克移动的状态  
          MainGame.my_tank.remove = True
        elif event.key == pygame.K_SPACE:
          # 判断子弹是否上限
          if len(MainGame.my_bullet_list) < 5:
            # 发射子弹
            print('发射子弹')
            # 创建子弹
            m_bullet = Bullet(MainGame.my_tank)
            # 将子弹添加到列表中
            MainGame.my_bullet_list.append(m_bullet)


      if event.type == pygame.KEYUP and event.key in (pygame.K_LEFT,pygame.K_RIGHT,pygame.K_UP,pygame.K_DOWN):
        # 修改坦克移动的状态  
        MainGame.my_tank.remove = False


敌方坦克随机发射子弹

实现发射子弹方法

  def shot(self):
    '''
     敌方坦克的射击
     '''
    num = random.randint(1,100)
    if num < 5:
      return Bullet(self)

敌方坦克加入窗口后,发射子弹,并将子弹添加到敌方子弹列表中

 #将敌方坦克加入到窗口中
  def display_enemy_tank(self) -> None:
    '''
     显示敌方坦克
     '''
    for e_tank in self.enemy_tank_list:
      # 显示敌方坦克
      e_tank.display_tank()
      # 移动敌方坦克
      e_tank.rand_move()
      # 发射子弹
      e_bullet = e_tank.shot()
      # 判断是否有子弹
      if e_bullet:
        # 将子弹增加到列表中
        MainGame.enemy_bullet_list.append(e_bullet)

将敌方发射的子弹添加到窗口

  def start_game(self) -> None:
    '''
     开始游戏
     '''
    # 初始化游戏窗口
    pygame.display.init()
    # 创建一个窗口
    MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
    # 设置窗口标题
    pygame.display.set_caption('坦克大战1.0')
    # 创建一个我方 坦克
    MainGame.my_tank = MyTank(350,200)
    # 创建敌方坦克
    self.create_enemy_tank()
    # 刷新窗口
    while True:
      sleep(0.02)
      # 给窗口设置填充色
      MainGame.window.fill(BG_COLOR)
      # 增加提示文字
      # 1.要增加文字内容
      # num = 6
      text = self.get_text_surface(f'敌方坦克剩余数量{MainGame.enemy_tank_count}')
      # 2.如何把文字加上
      MainGame.window.blit(text,(10,10))
      # 增加事件
      self.get_event()
      # 显示 我方坦克
      MainGame.my_tank.display_tank()
      # 显示敌方坦克
      self.display_enemy_tank()
      # 移动坦克
      if MainGame.my_tank.remove:
        MainGame.my_tank.move()
      # 显示我方子弹
      self.display_my_bullet()
      # 显示敌方子弹
      self.display_enemy_bullet()
      pygame.display.update()

我方子弹与敌方坦克的碰撞检测

在游戏开发中,通常把显示图像的对象叫做精灵Spire,精灵需要有两个属性,image要显示的图像,rect图像要显示在屏幕的位置。

在Pygame框架中,使用pygame. sprite模块中的内置函数可以实现碰撞检测。代码如下:

pygame.sprite.collide_rect(first, second) #返回布尔值

修改坦克类,增加是否存活状态

class Tank:
  '''
   坦克类
   '''
  def __init__(self) -> None:
    self.live = True

在子弹类中增加我方子弹碰撞敌方坦克的方法,如果发生碰撞,修改我方子弹及敌方坦克live属性的状态值。

  def hit_enemy_tank(self):
    for e_tank in MainGame.enemy_tank_list:
      # 判断子弹是否击中坦克
      if collide_rect(self,e_tank):
        # 修改子弹的状态
        self.live = False
        e_tank.live = False

在我方子弹移动后判断子弹是否与敌方坦克碰撞。

  def display_my_bullet(self) -> None:
    '''
     显示我方子弹
     '''
    for my_bullet in MainGame.my_bullet_list:
      # 判断子弹是否存活
      if my_bullet.live:
        # 显示我方子弹
        my_bullet.display_bullet()
        # 移动我方子弹
        my_bullet.move()
        # 判断我方子弹是否击中敌方坦克
        my_bullet.hit_enemy_tank()
      else:
        # 从列表中移除
        MainGame.my_bullet_list.remove(my_bullet)

修改MainGame类敌方坦克显示逻辑,根据敌方坦克是否存活

def display_enemy_tank(self) -> None:
  '''
     显示敌方坦克
     '''
  for e_tank in self.enemy_tank_list:
    #  判断敌方坦克是否存活
    if e_tank.live:
      # 显示敌方坦克
      e_tank.display_tank()
      # 移动敌方坦克
      e_tank.rand_move()
      # 发射子弹
      e_bullet = e_tank.shot()
      # 判断是否有子弹
      if e_bullet:
        # 将子弹增加到列表中
        MainGame.enemy_bullet_list.append(e_bullet)
      else:
        # 从列表中移除
        self.enemy_tank_list.remove(e_tank)

爆炸效果

添加爆炸效果

初始化爆炸类

 def __init__(self,tank:Tank) -> None:
    # 加载爆炸效果的图片
    self.images = [
      pygame.image.load('./img/blast0.gif'),
      pygame.image.load('./img/blast1.gif'),
      pygame.image.load('./img/blast2.gif'),
      pygame.image.load('./img/blast3.gif'),
      pygame.image.load('./img/blast4.gif'),
     ]
    # 设置爆炸效果的位置
    self.rect = tank.rect
    # 设置爆炸效果的索引
    self.step = 0
    # 获取需要渲染的图像
    self.image = self.images[self.step]
    # 设置爆炸的状态
    self.live = True

展示爆炸效果。

 def display_explode(self) -> None:
    '''
     显示爆炸效果
     '''
    # 判断当前爆照的效果是否播放完毕
    if self.step < len(self.images):
      # 获取当前爆炸效果的图像
      self.image = self.images[self.step]
      # 获取下一张爆炸效果的图像的索引
      self.step += 1
      # 绘制爆炸效果
      MainGame.window.blit(self.image,self.rect)
    else:
      # 初始化爆炸效果的索引
      self.step = 0
      # 设置爆炸效果的状态,代表爆炸过了
      self.live = False

在我方子弹碰撞敌方坦克的方法中,如果检测到碰撞,产生爆炸类,并将爆炸效果添加到爆炸列表。

  def hit_enemy_tank(self):
    for e_tank in MainGame.enemy_tank_list:
      # 判断子弹是否击中坦克
      if collide_rect(self,e_tank):
        # 爆炸效果
        explode = Explode(e_tank)
        MainGame.explode_list.append(explode)
        # 修改子弹的状态
        self.live = False
        e_tank.live = False

将爆炸效果添加到窗口。

  #新增方法: 展示爆炸效果列表


  def display_explode(self) -> None:
    '''
     显示爆炸效果
     '''
    for explode in MainGame.explode_list:
      # 判断是否活着
      if explode.live:
        # 显示爆炸效果
        explode.display_explode()
      else:
        # 从列表中移除
        MainGame.explode_list.remove(explode)

敌方子弹与我方坦克碰撞检测

子弹类中,新增敌方子弹与我方坦克的碰撞。如果发生碰撞,修改敌方子弹、我方坦克的状态及产生爆炸效果。

  #新增敌方子弹与我方坦克的碰撞方法
  def hit_my_tank(self):
    # 判断我方坦克是否活着
    if MainGame.my_tank and MainGame.my_tank.live:
      # 判断字段是否击中我方坦克
      if collide_rect(self,MainGame.my_tank):
        # 爆炸效果
        explode = Explode(MainGame.my_tank)
        MainGame.explode_list.append(explode)
        # 修改子弹的状态
        self.live = False
        MainGame.my_tank.live = False

添加敌方子弹到窗口中时候,如果子弹还活着,显示子弹、调用子弹移动并判断敌方子弹是否与我方坦克发生碰撞。

  #将敌方子弹加入到窗口中
  def display_my_bullet(self) -> None:
    '''
     显示我方子弹
     '''
    for my_bullet in MainGame.my_bullet_list:
      # 判断子弹是否存活
      if my_bullet.live:
        # 显示我方子弹
        my_bullet.display_bullet()
        # 移动我方子弹
        my_bullet.move()
        # 判断我方子弹是否击中敌方坦克
        my_bullet.hit_enemy_tank()
      else:
        # 从列表中移除
        MainGame.my_bullet_list.remove(my_bullet)

我方坦克无线重生

坦克大战游戏中一般我方坦克有重生的功能,当按下键盘的Esc键时候,让我方坦克重生。重生指的就是重新创建我方坦克。

  def create_my_tank(self) -> None:
    '''
     创建我方坦克
     '''
    MainGame.my_tank = MyTank(350,200)
  #获取事件
  def getEvent(self):
    #获取所有事件
    eventList= pygame.event.get()
    #遍历事件
    for event in event_list:
      if event.type == pygame.KEYDOWN:
        # 如果我方坦克死亡,按下esc键,重新生成我方坦克
        if not MainGame.my_tank and event.key == pygame.K_ESCAPE:
            print('重新生成我方坦克')
            # 按下esc键,重新生成我方坦克
            self.create_my_tank()

加载墙壁

初始化墙壁类

class Wall:
  '''
   墙壁类
   '''
  def __init__(self,left,top) -> None:
    # 加载图片
    self.image = pygame.image.load('./img/steels.gif')
    # 获取墙壁的图形
    self.rect = self.image.get_rect()
    # 设置墙壁的位置
    self.rect.left = left
    self.rect.top = top
  def display_wall(self) -> None:
    '''
     显示墙壁
     '''
    MainGame.window.blit(self.image,self.rect)

创建墙壁

  def create_wall(self) -> None:
    '''
     创建墙壁
     '''
    top = 200
    for i in range(6):
      # 创建墙壁
      wall = Wall(i*128,top)
      # 添加到墙壁列表中
      MainGame.wall_list.append(wall)

墙壁加入到窗口

  def display_wall(self) -> None:
    '''
     显示墙壁
     '''
    for wall in MainGame.wall_list:
      # 显示墙壁
      wall.display_wall()

子弹不能穿墙

子弹不能穿墙指子弹碰到墙壁后消失。因此,子弹类中新增方法,子弹与墙壁的碰撞,如果子弹与墙壁碰撞,修改子弹的状态。另外还需要将墙壁的生命值减少,如果墙壁的生命值小于等于零时候修改墙壁的状态。

  #新增子弹与墙壁的碰撞
  def hit_wall(self):
    '''
     碰撞墙壁
     '''
    for wall in MainGame.wall_list:
      # 判断是否碰撞
      if collide_rect(self,wall):
        #  修改子弹的状态
        self.live = False

设置我方与敌方坦克子弹移动时,增加碰撞检测

  def display_enemy_bullet(self) -> None:
    '''
     显示敌方子弹
     '''
    for e_bullet in MainGame.enemy_bullet_list:
      # 显示子弹
      if e_bullet.live:
        # 如果子弹存活,显示子弹
        e_bullet.display_bullet()
        e_bullet.move()
        # 判断是否击中我方坦克
        e_bullet.hit_my_tank()
        # 判断是否击中墙壁
        e_bullet.hit_wall()
      else:
        # 如果子弹不存活,从列表中移除
        MainGame.enemy_bullet_list.remove(e_bullet)
  def display_my_bullet(self) -> None:
    '''
     显示我方子弹
     '''
    for my_bullet in MainGame.my_bullet_list:
      # 判断子弹是否存活
      if my_bullet.live:
        # 显示我方子弹
        my_bullet.display_bullet()
        # 移动我方子弹
        my_bullet.move()
        # 判断我方子弹是否击中敌方坦克
        my_bullet.hit_enemy_tank()
        # 判断我方子弹是否击中墙壁
        my_bullet.hit_wall()
      else:
        # 从列表中移除
        MainGame.my_bullet_list.remove(my_bullet)

设置墙壁耐久

设置墙壁生命值与存活状态

class Wall:
  '''
   墙壁类
   '''
  def __init__(self,left,top) -> None:
    # 加载图片
    self.image = pygame.image.load('./img/steels.gif')
    # 获取墙壁的图形
    self.rect = self.image.get_rect()
    # 设置墙壁的位置
    self.rect.left = left
    self.rect.top = top
    # 设置墙壁的生命值
    self.hp = 3
    # 设置墙壁的状态
    self.live = True

修改子弹碰撞墙壁逻辑

class Bullet:
  '''
   子弹类
   '''
  def hit_wall(self):
    '''
     碰撞墙壁
     '''
    for wall in MainGame.wall_list:
      # 判断是否碰撞
      if collide_rect(self,wall):
        #  修改子弹的状态
        self.live = False
        # 修改墙壁的生命值
        wall.hp -= 1
        # 判断墙壁是否依然显示
        if wall.hp <= 0:
          wall.live = False

修改显示墙壁逻辑

 def display_wall(self) -> None:
    '''
     显示墙壁
     '''
    for wall in MainGame.wall_list:
      if wall.live:
        # 显示墙壁
        wall.display_wall()
      else:
        # 从列表中移除
        MainGame.wall_list.remove(wall)

坦克不能穿墙功能

坦克不能穿墙指坦克一旦碰到墙壁则不能再移动,也就是需要修改坦克的坐标为移动之前的。因此在坦克类中新增属性oldLeft、oldTop记录移动之前的坐标,新增stay()、hitWalls()方法。

class Tank:
  '''
   坦克类
   '''
  def __init__(self) -> None:
    self.live = True
    # 记录坦克原来的位置
    self.old_left = 0
    self.old_top = 0 
  def move(self) -> None:
    '''
     坦克的移动
     '''
    # 记录坦克原来的位置,为了方便还原碰撞后的位置
    self.old_left = self.rect.left
    self.old_top = self.rect.top
    if self.direction == "L":
      # 判断坦克的位置是否已左边界
      if self.rect.left > 0:
        # 修改坦克的位置 离左边的距离  - 操作
        self.rect.left = self.rect.left - self.speed
    elif self.direction == "R":
      # 判断坦克的位置是否已右边界
      if self.rect.left + self.rect.width < SCREEN_WIDTH:
        # 修改坦克的位置 离左边的距离  + 操作
        self.rect.left = self.rect.left + self.speed
    elif self.direction == "U":
      # 判断坦克的位置是否已上边界
      if self.rect.top > 0:
        # 修改坦克的位置 离上边的距离  - 操作
        self.rect.top = self.rect.top - self.speed
    elif self.direction == "D":
      # 判断坦克的位置是否已下边界
      if self.rect.top + self.rect.height < SCREEN_HEIGHT:
        # 修改坦克的位置 离上边的距离  + 操作
        self.rect.top = self.rect.top + self.speed


  def tank_hit_wall(self) -> None:
    '''
     坦克和墙壁的碰撞
     '''
    for wall in MainGame.wall_list:
      # 检测当前坦克是否能和墙壁发生碰撞
      if pygame.sprite.collide_rect(self,wall):
        # 将位置还原到碰撞前的位置
        self.rect.left = self.old_left
        self.rect.top = self.old_top

坦克移动时,检测是否碰撞

def display_enemy_tank(self) -> None:
  '''
     显示敌方坦克
     '''
  for e_tank in self.enemy_tank_list:
    #  判断敌方坦克是否存活
    if e_tank.live:
      # 显示敌方坦克
      e_tank.display_tank()
      # 移动敌方坦克
      e_tank.rand_move()
      # 判断是否与墙壁发生碰撞
      e_tank.tank_hit_wall()
      # 发射子弹
      e_bullet = e_tank.shot()
      # 判断是否有子弹
      if e_bullet:
        # 将子弹增加到列表中
        MainGame.enemy_bullet_list.append(e_bullet)
      else:
        # 从列表中移除
        self.enemy_tank_list.remove(e_tank)
 # 判断我方坦克是否死亡
if MainGame.my_tank and MainGame.my_tank.live:
  # 移动坦克
  if MainGame.my_tank.remove:
    MainGame.my_tank.move()
    # 检测我方坦克是否与墙壁发生碰撞
    MainGame.my_tank.tank_hit_wall()

双方坦克之间的碰撞检测

如果我方坦克碰撞到敌方坦克,则我方坦克再不能继续移动。同理如果敌方坦克碰撞到我方坦克也不能继续移动。

在坦克类中新增坦克与坦克碰撞的检测方法

class Tank:
  def tank_collide_tank(self,tank):
    '''
       检测2个坦克是否碰撞
     '''
    # 判断是否都存活
    if self.live and tank.live:
      if pygame.sprite.collide_rect(self,tank):
        # 将位置还原到碰撞前的位置
        self.rect.left = self.old_left
        self.rect.top = self.old_top

我方坦克移动后,调用是否与敌方坦克发生碰撞。

      #根据坦克的开关状态调用坦克的移动方法
      if MainGame.TANK_P1 and not MainGame.TANK_P1.stop:
        MainGame.TANK_P1.move()
        #调用碰撞墙壁的方法
        MainGame.TANK_P1.hitWalls()
        MainGame.TANK_P1.hitEnemyTank()

在敌方坦克类中,新增敌方坦克碰撞我方坦克的方法。

  def hitMyTank(self):
    if MainGame.TANK_P1 and MainGame.TANK_P1.live:
      if pygame.sprite.collide_rect(self, MainGame.TANK_P1):
        # 让敌方坦克停下来  stay()
        self.stay()

敌方坦克添加到窗口时候,调用是否与我方坦克碰撞。

  #将敌方坦克加入到窗口中
  def blitEnemyTank(self):
    for eTank in MainGame.EnemyTank_list:
      if eTank.live:
        eTank.displayTank()
        # 坦克移动的方法
        eTank.randMove()
        #调用敌方坦克与墙壁的碰撞方法
        eTank.hitWalls()
        #敌方坦克是否撞到我方坦克
        eTank.hitMyTank()
        # 调用敌方坦克的射击
        eBullet = eTank.shot()
        # 如果子弹为None。不加入到列表
        if eBullet:
          # 将子弹存储敌方子弹列表
          MainGame.Enemy_bullet_list.append(eBullet)
      else:
        MainGame.EnemyTank_list.remove(eTank)

音效处理

music是pygame中控制流音频的pygame模块,音乐模块与pygame.mixer紧密相连, pygame.mixer是一个用来处理声音的模块,其含义为“混音器”。游戏中对声音的处理一般包括制造声音和播放声音两部分。

初始化混合器

pygame.mixer.init()

加载一个播放音乐的文件

pygame.mixer.music.load()

开始播放音乐流

pygame.mixer.music.play()

初始化音效类

class Music():
  def __init__(self,fileName):
    self.fileName = fileName
    #先初始化混合器
    pygame.mixer.init()
    pygame.mixer.music.load(self.fileName)
  #开始播放音乐
  def play(self):
    pygame.mixer.music.play()

创建坦克时,添加音效。

  #创建我方坦克的方法
  def creatMyTank(self):
    # 创建我方坦克
    MainGame.TANK_P1 = MyTank(400, 300)
    #创建音乐对象
    music = Music('img/start.wav')
    #调用播放音乐方法
    music.play()

我方坦克发射子弹时,添加音效。

          elif event.key == pygame.K_SPACE:
            print("发射子弹")
            if len(MainGame.Bullet_list) < 3:
              # 产生一颗子弹
              m = Bullet(MainGame.TANK_P1)
              # 将子弹加入到子弹列表
              MainGame.Bullet_list.append(m)
              music = Music('img/fire.wav')
              music.play()

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值