找回密码
 立即注册
首页 业界区 安全 pygame小游戏飞机大战_15子弹和飞机的碰撞 ...

pygame小游戏飞机大战_15子弹和飞机的碰撞

森萌黠 昨天 18:08
创建存放飞机子弹的组:
  1. #存放所有飞机子弹的组
  2. bullets = pygame.sprite.Group()
复制代码
在判断按下子弹的判断中加入存放飞机子弹组的代码:
  1. if key_pressed[K_SPACE]:
  2.     # 按下空格键发射子弹
  3.     bullet = Bullet(self.screen, self.rect.left, self.rect.top)
  4.     # 将子弹存入列表
  5.     self.bullets.add(bullet)
  6.     # 存放所有飞机子弹的组
  7.     Plane.bullets.add(bullet)
复制代码
加入碰撞判断和爆炸效果:
  1. # 玩家子弹和所有敌机的碰撞判断
  2. is_enemy = pygame.sprite.groupcollide(Plane.bullets, self.enemys,True,True)
  3. if is_enemy:
  4.     items = list(is_enemy.items())[0]
  5.     y = items[1][0]
  6.     # 敌机爆炸图片
  7.     self.enemy_bomb.action(y.rect)
  8.     # 加入声音
  9.     self.sound.playBombSound()
复制代码
创建存放敌人子弹的组:
  1. # 存放所有敌人子弹的组
  2. bullets = pygame.sprite.Group()
复制代码
在判断按下子弹的判断中加入存放敌人子弹组的代码:
  1. # 使screen变为飞机类的一个属性
  2. self.screen = screen
  3. # 定义装子弹的精灵组
  4. self.bullets = pygame.sprite.Group()
复制代码
在Manager中加入新的两个变量进行游戏结束的判断:
  1. class Manager(object):
  2.     bg_size = (480,700)
  3.     #游戏结束倒计时的id
  4.     game_over_id = 11
  5.     #游戏是否结束
  6.     is_game_over = False
复制代码
判断敌机子弹和飞机的判断:
  1. # 玩家飞机和敌机子弹的判断
  2. if self.players.sprites():
  3.     isover = pygame.sprite.spritecollide(self.players.sprites()[0], Enemy.bullets,True)
  4.     if isover:
  5.         Manager.is_game_over = True  # 标示着游戏结束
  6.         pygame.time.set_timer(Manager.game_over_id, 1000)  # 开始游戏倒计时
  7.         print('中弹')
  8.         self.player_bomb.action(self.players.sprites()[0].rect)
  9.         # 把玩家飞机从精灵组移除
  10.         self.players.remove(self.players.sprites()[0])
  11.         # 爆炸的声音
  12.         self.sound.playBombSound()
复制代码
完整代码:
  1. # 引入random
  2. import random
  3. # 引入pygame
  4. import pygame
  5. # 引入time模块
  6. import time
  7. # 引入pygame中的所有方法
  8. from pygame.constants import K_UP, K_RIGHT, K_DOWN, K_LEFT, K_w, K_a, K_s, K_d, K_SPACE
  9. # 定义初始为向右
  10. direction = "right"
  11. # 引入敌方飞机的类
  12. class Enemy(pygame.sprite.Sprite):
  13.     # 存放所有敌人子弹的组
  14.     bullets = pygame.sprite.Group()
  15.     def __init__(self, screen):
  16.         # 调用继承精灵初始化方法
  17.         pygame.sprite.Sprite.__init__(self)
  18.         # 引入图片创建敌人
  19.         self.enemy = pygame.image.load("./images/enemy1.png")
  20.         self.image = self.enemy
  21.         # 设置速度变量
  22.         self.speed = 10  # 降低速度使游戏可玩
  23.         # 根据图片进行获取矩形对象
  24.         self.rect = self.image.get_rect()
  25.         self.rect.topleft = [0, 0]
  26.         self.x = 0
  27.         self.y = 0
  28.         # 使screen变为飞机类的一个属性
  29.         self.screen = screen
  30.         # 定义装子弹的精灵组
  31.         self.bullets = pygame.sprite.Group()
  32.     def display(self):
  33.         self.screen.blit(self.enemy, (self.rect.left, self.rect.top))
  34.         # 改为使用精灵组的方法绘制子弹
  35.         self.bullets.update()  # 更新子弹位置
  36.         self.bullets.draw(self.screen)  # 绘制子弹
  37.     # 定义移动飞机的方法
  38.     def auto_move(self):
  39.         # 将direction改为全局变量
  40.         global direction
  41.         # 判断方向进行移动
  42.         if direction == "right":
  43.             self.rect.right += self.speed
  44.         if direction == "left":
  45.             self.rect.right -= self.speed
  46.         # 定义碰壁时调整移动方向
  47.         if self.rect.right >= 480 - 51:
  48.             direction = "left"
  49.         if self.rect.right <= 0:
  50.             direction = "right"
  51.     def update(self):
  52.         self.auto_fire()
  53.         self.auto_move()
  54.         self.display()
  55.     # 定义自动开火的方法
  56.     def auto_fire(self):
  57.         # 使用随机数函数进行随机抽取一个1到10的一个随机数
  58.         random_number = random.randint(1, 40)
  59.         # 当随机数为8时创建子弹
  60.         if random_number == 8:
  61.             # 创建单个子弹
  62.             bullet = EnemyBullet(self.screen, self.rect.left, self.rect.top)
  63.             # 将子弹放入列表中
  64.             self.bullets.add(bullet)
  65.             # 存放所有飞机子弹的组
  66.             Enemy.bullets.add(bullet)
  67. # 引入飞机的类
  68. class Plane(pygame.sprite.Sprite):
  69.     # 存放所有飞机子弹的组
  70.     bullets = pygame.sprite.Group()
  71.     # 创建玩家的方法,引入screen模块
  72.     def __init__(self, screen):
  73.         # 引入图片创建玩家
  74.         self.player = pygame.image.load("./images/me1.png")
  75.         self.image = self.player
  76.         # 设置速度变量
  77.         self.speed = 5
  78.         # 调用继承精灵初始化方法
  79.         pygame.sprite.Sprite.__init__(self)
  80.         # 根据图片进行获取矩形对象
  81.         self.rect = self.image.get_rect()
  82.         self.rect.topleft = [179, 500]
  83.         self.x = 179
  84.         self.y = 500
  85.         # 使screen变为飞机类的一个属性
  86.         self.screen = screen
  87.         # 定义装子弹的列表
  88.         self.bullets = pygame.sprite.Group()
  89.     # 定义update方法包含检测指令和绘制
  90.     def update(self):
  91.         self.key_control()
  92.         self.display()
  93.     # 创建玩家移动的方法
  94.     def key_control(self):
  95.         # 判断按下键盘事件,对玩家x,y坐标进行调整使玩家移动
  96.         key_pressed = pygame.key.get_pressed()
  97.         if key_pressed[K_w] or key_pressed[K_UP]:
  98.             self.rect.top -= self.speed
  99.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  100.             self.rect.right += self.speed
  101.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  102.             self.rect.left -= self.speed
  103.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  104.             self.rect.bottom += self.speed
  105.         if key_pressed[K_SPACE]:
  106.             # 按下空格键发射子弹
  107.             bullet = Bullet(self.screen, self.rect.left, self.rect.top)
  108.             # 将子弹存入列表
  109.             self.bullets.add(bullet)
  110.             # 存放所有飞机子弹的组
  111.             Plane.bullets.add(bullet)
  112.     def display(self):
  113.         # 绘制玩家
  114.         self.screen.blit(self.player, self.rect)
  115.         # 更新子弹坐标
  116.         self.bullets.update()
  117.         # 绘制所有子弹到屏幕
  118.         self.bullets.draw(self.screen)
  119. # 引入敌人子弹的类
  120. class EnemyBullet(pygame.sprite.Sprite):
  121.     def __init__(self, screen, x, y):
  122.         # 调用继承精灵初始化方法
  123.         pygame.sprite.Sprite.__init__(self)
  124.         # 引入子弹图片
  125.         self.image = pygame.image.load("./images/bullet2.png")
  126.         # 根据图片进行获取矩形对象
  127.         self.rect = self.image.get_rect()
  128.         self.rect.topleft = [x + 29 - 2, y + 43]
  129.         self.x = x + 29 - 2
  130.         self.y = y + 43
  131.         # 显示窗口
  132.         self.screen = screen
  133.         # 定义速度
  134.         self.speed = 4
  135.     def update(self):
  136.         # 修改子弹坐标
  137.         self.rect.top += self.speed
  138.         # 如果子弹出界,销毁子弹
  139.         if self.rect.top > 700:
  140.             self.kill()
  141. # 引入子弹的类
  142. class Bullet(pygame.sprite.Sprite):
  143.     def __init__(self, screen, x, y):
  144.         # 调用继承精灵初始化方法
  145.         pygame.sprite.Sprite.__init__(self)
  146.         # 引入子弹图片
  147.         self.image = pygame.image.load("./images/bullet1.png")
  148.         # 根据图片进行获取矩形对象
  149.         self.rect = self.image.get_rect()
  150.         self.rect.topleft = [x + 51 - 2, y]
  151.         self.x = x + 51 - 2
  152.         self.y = y
  153.         # 显示窗口
  154.         self.screen = screen
  155.         # 定义速度
  156.         self.speed = 10
  157.     def update(self):
  158.         # 修改子弹坐标
  159.         self.rect.top -= self.speed
  160.         # 如果子弹出界,销毁子弹
  161.         if self.rect.top < -22:
  162.             self.kill()
  163. # 定义音乐的类
  164. class GameSound(object):
  165.     def __init__(self):
  166.         # 初始化主程序
  167.         pygame.mixer.init()
  168.         # 引入背景音乐
  169.         pygame.mixer.music.load("./sound/game_music.ogg")
  170.         # 调整声音大小
  171.         pygame.mixer.music.set_volume(0.5)
  172.         self.__bomb = pygame.mixer.Sound('./sound/get_bomb.wav')
  173.     def playBombSound(self):
  174.         pygame.mixer.Sound.play(self.__bomb)
  175.     def PlayMusic(self):
  176.         # 开始播放音乐
  177.         pygame.mixer.music.play(-1)
  178. #  定义碰撞的类
  179. class Bomb(object):
  180.     # 初始化碰撞
  181.     def __init__(self, screen, type):
  182.         self.screen = screen
  183.         if type == "enemy":
  184.             # 加载爆炸资源
  185.             self.mImage = [pygame.image.load("./images/enemy1_down" + str(v) + ".png") for v in range(1, 5)]
  186.         else:
  187.             # 加载爆炸资源
  188.             self.mImage = [pygame.image.load("./images/me_destroy_" + str(v) + ".png") for v in range(1, 5)]
  189.         # 设置当前爆炸播放索引
  190.         self.mIndex = 0
  191.         # 爆炸位置
  192.         self.mPos = [0, 0]
  193.         # 是否可见
  194.         self.mVisible = False
  195.     def action(self, rect):
  196.         # 触发爆炸方法draw
  197.         # 爆炸的坐标
  198.         self.mPos[0] = rect.left
  199.         self.mPos[1] = rect.top
  200.         # 打开爆炸的开关
  201.         self.mVisible = True
  202.         # 重置索引
  203.         self.mIndex = 0
  204.     def draw(self):
  205.         if not self.mVisible:
  206.             return
  207.         # 绘制当前爆炸帧
  208.         self.screen.blit(self.mImage[self.mIndex], (self.mPos[0], self.mPos[1]))
  209.         # 更新索引
  210.         self.mIndex += 1
  211.         if self.mIndex >= len(self.mImage):
  212.             self.mVisible = False
  213.             self.mIndex = 0
  214. class BackGround:
  215.     # 初始化地图
  216.     def __init__(self, screen):
  217.         self.mImage1 = pygame.image.load("./images/background.png")
  218.         self.mImage2 = pygame.image.load("./images/background.png")
  219.         # 窗口
  220.         self.screen = screen
  221.         # 辅助移动
  222.         self.y1 = 0
  223.         # 衔接地图y轴
  224.         self.y2 = -Manager.bg_size[1]
  225.     def draw(self):
  226.         self.screen.blit(self.mImage1, (0, self.y1))
  227.         self.screen.blit(self.mImage2, (0, self.y2))
  228.     def move(self):
  229.         self.y1 += 2
  230.         self.y2 += 2
  231.         if self.y1 >= Manager.bg_size[1]:
  232.             self.y1 = 0
  233.         if self.y2 >= 0:
  234.             self.y2 = -Manager.bg_size[1]
  235. class Manager(object):
  236.     bg_size = (480, 700)
  237.     # 游戏结束倒计时的id
  238.     game_over_id = 11
  239.     # 游戏是否结束
  240.     is_game_over = False
  241.     def __init__(self):
  242.         pygame.init()
  243.         # 创建窗口
  244.         self.screen = pygame.display.set_mode(Manager.bg_size, 0, 32)
  245.         # 创建背景图片
  246.         # self.background = pygame.image.load("./images/background.png")
  247.         self.map = BackGround(self.screen)
  248.         # 初始化一个装玩家精灵的group
  249.         self.players = pygame.sprite.Group()
  250.         # 初始化一个装敌机精灵的group
  251.         self.enemys = pygame.sprite.Group()
  252.         # 初始化一个玩家爆炸的对象
  253.         self.player_bomb = Bomb(self.screen, 'player')
  254.         # 初始化一个敌机爆炸的对象
  255.         self.enemy_bomb = Bomb(self.screen, 'enemy')
  256.         # 初始化一个声音播放的对象
  257.         self.sound = GameSound()
  258.     def exit(self):
  259.         print('退出')
  260.         pygame.quit()
  261.         exit()
  262.     def new_player(self):
  263.         # 创建飞机对象 添加到玩家的组
  264.         player = Plane(self.screen)
  265.         self.players.add(player)
  266.     def new_enemy(self):
  267.         # 创建敌机的对象 添加到敌机的组
  268.         enemy = Enemy(self.screen)
  269.         self.enemys.add(enemy)
  270.     def drawText(self, text, x, y, textHeight=30, fontColor=(225, 0, 0), backgroudColor=None):
  271.         # 通过字体文件获取字体对象
  272.         font_obj = pygame.font.Font('freesansbold.ttf', textHeight)
  273.         # 配置要显示的文字
  274.         text_obj = font_obj.render(text, True, fontColor, backgroudColor)
  275.         # 获取要显示的对象的rect
  276.         text_rect = text_obj.get_rect()
  277.         # 设置显示对象的坐标
  278.         text_rect.topleft = (x, y)
  279.         # 绘制字到指定区域
  280.         self.screen.blit(text_obj, text_rect)
  281.     def main(self):
  282.         # 播放背景音乐
  283.         self.sound.PlayMusic()
  284.         # 创建一个玩家
  285.         self.new_player()
  286.         # 创建一个敌机
  287.         self.new_enemy()
  288.         while True:
  289.             # 把背景图片贴到窗口
  290.             # self.screen.blit(self.background, (0, 0))
  291.             # 移动地图
  292.             self.map.move()
  293.             # 把地图贴到窗口上
  294.             self.map.draw()
  295.             # 遍历所有的事件
  296.             for event in pygame.event.get():
  297.                 # 判断事件类型如果是pygame的退出
  298.                 if event.type == pygame.QUIT:
  299.                     self.exit()
  300.             # 绘制文字
  301.             self.drawText('hp:10000', 0, 0)
  302.             # 玩家飞机和子弹的显示
  303.             self.players.update()
  304.             # 敌机和子弹的显示
  305.             self.enemys.update()
  306.             # 绘制爆炸效果
  307.             self.player_bomb.draw()
  308.             self.enemy_bomb.draw()
  309.             # 刷新窗口内容
  310.             pygame.display.update()
  311.             time.sleep(0.01)
  312.             # 判断碰撞
  313.             iscollide = pygame.sprite.groupcollide(self.players, self.enemys, True, True)
  314.             # 玩家子弹和所有敌机的碰撞判断
  315.             is_enemy = pygame.sprite.groupcollide(Plane.bullets, self.enemys, True, True)
  316.             # 玩家飞机和敌机子弹的判断
  317.             if self.players.sprites():
  318.                 isover = pygame.sprite.spritecollide(self.players.sprites()[0], Enemy.bullets, True)
  319.                 if isover:
  320.                     Manager.is_game_over = True  # 标示着游戏结束
  321.                     pygame.time.set_timer(Manager.game_over_id, 1000)  # 开始游戏倒计时
  322.                     print('中弹')
  323.                     self.player_bomb.action(self.players.sprites()[0].rect)
  324.                     # 把玩家飞机从精灵组移除
  325.                     self.players.remove(self.players.sprites()[0])
  326.                     # 爆炸的声音
  327.                     self.sound.playBombSound()
  328.             if is_enemy:
  329.                 items = list(is_enemy.items())[0]
  330.                 y = items[1][0]
  331.                 # 敌机爆炸图片
  332.                 self.enemy_bomb.action(y.rect)
  333.                 # 加入声音
  334.                 self.sound.playBombSound()
  335.             if iscollide:
  336.                 items = list(iscollide.items())[0]
  337.                 print(items)
  338.                 x = items[0]
  339.                 y = items[1][0]
  340.                 # 玩家爆炸图片
  341.                 self.player_bomb.action(x.rect)
  342.                 # 敌机爆炸图片
  343.                 self.enemy_bomb.action(y.rect)
  344.                 # 加入声音
  345.                 self.sound.playBombSound()
  346. if __name__ == "__main__":
  347.     # 初始化pygame
  348.     pygame.init()
  349.     manager = Manager()
  350.     manager.main()
复制代码
 

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册