鱼C论坛

 找回密码
 立即注册
查看: 32|回复: 0

打飞机,3条生命结束后,绘制结束和再次开始按钮,点击不响应

[复制链接]
最佳答案
0 
发表于 2020-5-23 11:35:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 猪猪虾 于 2020-5-23 11:38 编辑


游戏没有任何报错,所有模块都正常
在198,204行,分别定义了两个按钮的响应函数
在508,504行,绘制了两个按钮

  1. import sys
  2. import traceback
  3. from pygame.locals import *
  4. import pygame
  5. import myplane
  6. import enemy
  7. import bullet
  8. import supply
  9. import random
  10. pygame.init()
  11. pygame.mixer.init()


  12. bg_size = width,height = 480,700
  13. screen = pygame.display.set_mode(bg_size)
  14. pygame.display.set_caption("飞机大战")

  15. background = pygame.image.load("image/background.png").convert()

  16. BLACK = (0,0,0)
  17. GREEN = (0,255,0)
  18. RED = (255,0,0)
  19. WHITE = (255,255,255)

  20. #载入游戏音乐
  21. pygame.mixer.music.load("sound/game_music.ogg")
  22. pygame.mixer.music.set_volume(0.2)
  23. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  24. bullet_sound.set_volume(0.2)
  25. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  26. bomb_sound.set_volume(0.2)
  27. supply_sound = pygame.mixer.Sound("sound/supply.wav")
  28. supply_sound.set_volume(0.2)
  29. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  30. get_bomb_sound.set_volume(0.2)
  31. get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
  32. get_bullet_sound.set_volume(0.2)
  33. upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
  34. upgrade_sound.set_volume(0.2)
  35. enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
  36. enemy3_fly_sound.set_volume(0.2)
  37. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  38. enemy1_down_sound.set_volume(0.2)
  39. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  40. enemy2_down_sound.set_volume(0.2)
  41. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  42. enemy3_down_sound.set_volume(0.2)
  43. me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
  44. me_down_sound.set_volume(0.2)


  45. def add_small_enemies(group1,group2,num):
  46.     for i in range(num):
  47.         e1 = enemy.Smallenemy(bg_size)
  48.         group1.add(e1)
  49.         group2.add(e1)

  50. def add_mid_enemies(group1,group2,num):
  51.     for i in range(num):
  52.         e2 = enemy.Midenemy(bg_size)
  53.         group1.add(e2)
  54.         group2.add(e2)

  55. def add_big_enemies(group1,group2,num):
  56.     for i in range(num):
  57.         e3 = enemy.Bigenemy(bg_size)
  58.         group1.add(e3)
  59.         group2.add(e3)

  60. def inc_speed(target,inc):
  61.     for each in target:
  62.         each.speed += inc

  63. def main():
  64.     pygame.mixer.music.play(-1)   #无限循环背景
  65.     clock = pygame.time.Clock()

  66.     #生成我方飞机
  67.     me = myplane.Myplane(bg_size)


  68.    
  69.     #生成敌方飞机
  70.     enemies = pygame.sprite.Group()   #存放所有的敌人飞机

  71.     #生成普通子弹
  72.     bullet1 = []
  73.     bullet1_index = 0
  74.     BULLEF1_NUM = 4  #在这个游戏的设置中,四颗子弹能够保证整个屏幕的显示是连贯的
  75.     for i in range(BULLEF1_NUM):
  76.         bullet1.append(bullet.Bullet1(me.rect.midtop))   #在飞机顶部的中央生成子弹,

  77.     #生成超级子弹
  78.     bullet2 = []
  79.     bullet2_index = 0
  80.     BULLEF2_NUM = 8  #在这个游戏的设置中,四颗子弹能够保证整个屏幕的显示是连贯的
  81.     for i in range(BULLEF2_NUM //2):    #添加4次,每次添加两个
  82.         bullet2.append(bullet.Bullet2((me.rect.centerx-33,me.rect.centery)))
  83.         bullet2.append(bullet.Bullet2((me.rect.centerx+33,me.rect.centery)))     #发射两发子弹         
  84.    
  85.     #small
  86.     small_enemies = pygame.sprite.Group()
  87.     add_small_enemies(small_enemies,enemies,15)   #添加15个小型飞机


  88.     #middle
  89.     mid_enemies = pygame.sprite.Group()
  90.     add_mid_enemies(mid_enemies,enemies,4)   #添加15个小型飞机
  91.    

  92.     #big
  93.     big_enemies = pygame.sprite.Group()
  94.     add_big_enemies(big_enemies,enemies,2)   #添加15个小型飞机
  95.    

  96.     #中弹图片索引
  97.     e1_destroy_index = 0
  98.     e2_destroy_index = 0
  99.     e3_destroy_index = 0
  100.     me_destroy_index = 0
  101.    
  102.     #统计得分
  103.     score = 0
  104.     score_font = pygame.font.Font("font/font.ttf",36)

  105.     #标志鼠标是否被按下
  106.     paused = False
  107.     pause_nor_image = pygame.image.load("image/pause_nor.png").convert_alpha()
  108.     pause_pressed_image = pygame.image.load("image/pause_pressed.png").convert_alpha()
  109.     resume_nor_image = pygame.image.load("image/resume_nor.png").convert_alpha()
  110.     resume_pressed_image = pygame.image.load("image/resume_pressed.png").convert_alpha()
  111.     paused_rect = pause_nor_image.get_rect()
  112.     paused_rect.left,paused_rect.top = width - paused_rect.width - 10,10
  113.     pause_image = pause_nor_image
  114.     #用于切换图片
  115.     switch_image = True

  116.     #延时图片的切换,有突突的感觉
  117.     delay = 100
  118.    
  119.     #设置难度级别
  120.     level = 1

  121.     #全屏炸弹
  122.     bomb_image = pygame.image.load("image/bomb.png").convert_alpha()
  123.     bomb_rect = bomb_image.get_rect()
  124.     bomb_font = pygame.font.Font("font/font.ttf",48)
  125.     bomb_num = 3

  126.     #显示生命
  127.     life_image = pygame.image.load("image/life.png").convert_alpha()
  128.     life_rect = life_image.get_rect()
  129.     life_font = pygame.font.Font("font/font.ttf",48)
  130.     life_num = 3

  131.     #加载重新开始和游戏结束按钮
  132.     over_image = pygame.image.load("image/gameover.png").convert_alpha()
  133.     again_image = pygame.image.load("image/again.png").convert_alpha()
  134.     over_rect = over_image.get_rect()
  135.     again_rect = again_image.get_rect()

  136.     #每30秒发放一个补给包
  137.     bullet_supply = supply.Bullet_Supply(bg_size)
  138.     bomb_supply = supply.Bomb_Supply(bg_size)
  139.     #自定义一个定时器发放炸弹
  140.     SUPPLY_TIME = USEREVENT
  141.     pygame.time.set_timer(SUPPLY_TIME,30 * 1000)

  142.     #超级子弹定时器
  143.     DOUBLE_BULLET_TIME = USEREVENT + 1
  144.    
  145.                        
  146.     #用来标志是否使用超级子弹
  147.     is_double_bullet = False

  148.    
  149.     running = True
  150.     while running:
  151.         for event in pygame.event.get():
  152.                 if event.type == QUIT:
  153.                     pygame.quit()
  154.                     sys.exit()
  155.                     
  156.                 elif event.type == MOUSEBUTTONDOWN:
  157.                     #判断鼠标左键是否按下,且调用collidepoint判断鼠标是否在矩形范围内
  158.                     if event.button == 1 and paused_rect.collidepoint(event.pos):
  159.                         paused = not paused
  160.                         if paused:
  161.                             pygame.time.set_timer(SUPPLY_TIME,0)   #设置为0,就是取消定时时间
  162.                             pygame.mixer.music.pause()    #暂停背景音乐
  163.                             pygame.mixer.pause()          #暂停所有的音效
  164.                         else:
  165.                             pygame.time.set_timer(SUPPLY_TIME,30 * 1000)
  166.                             pygame.mixer.music.unpause()   
  167.                             pygame.mixer.unpause()
  168.                            
  169.                     #判断鼠标是否在“游戏结束”按钮内
  170.                     if event.button == 1 and over_rect.collidepoint(event.pos):
  171.                         pygame.quit()
  172.                         sys.exit()
  173.                         running = False
  174.                         
  175.                     #判断鼠标是否在“重新开始按钮内”
  176.                     if event.button == 1 and again_rect.collidepoint(event.pos):
  177.                         running = not running


  178.                
  179.                            
  180.                 #以下判断是为了显示鼠标悬浮在暂停图片方时,图片的颜色会变深,鼠标在图片上点击才会真正执行暂停和继续
  181.                 elif event.type == MOUSEMOTION:
  182.                     if paused_rect.collidepoint(event.pos):   #鼠标悬浮在图片上方
  183.                         if paused:
  184.                             pause_image = resume_pressed_image
  185.                         else:
  186.                             pause_image = pause_pressed_image
  187.                     else:
  188.                         if paused:
  189.                             pause_image = resume_nor_image
  190.                         else:
  191.                             pause_image = pause_nor_image



  192.                 elif event.type == KEYDOWN:
  193.                     if event.key == K_SPACE:
  194.                        if bomb_num:
  195.                            bomb_num -= 1
  196.                            bomb_sound.play()
  197.                            for each in enemies:
  198.                                if each.rect.bottom > 0:
  199.                                    each.active = False
  200.                                    
  201.                 elif  event.type == SUPPLY_TIME:
  202.                     supply_sound.play()
  203.                     if random.choice([True,False]) == True:    #随机选取一个发放
  204.                         bomb_supply.reset()
  205.                     else:
  206.                         bullet_supply.reset()

  207.                 elif event.type == DOUBLE_BULLET_TIME:
  208.                        is_double_bullet = False
  209.                        pygame.time.set_timer(DOUBLE_BULLET_TIME,0)
  210.                        

  211.                         
  212.                     
  213.                         
  214.         screen.blit(background,(0,0))
  215.         #根据用户的得分增加难度
  216.         if level == 1 and score >10000:
  217.             level = 2
  218.             upgrade_sound.play()

  219.             #增加3架小型敌机,2架中,1架大
  220.             add_small_enemies(small_enemies,enemies,3)   #添加3个小型飞机
  221.             add_mid_enemies(mid_enemies,enemies,2)
  222.             add_big_enemies(big_enemies,enemies,1)

  223.             #提升小型飞机的速度
  224.             inc_speed(small_enemies,1)

  225.         elif level == 2 and score >30000:
  226.             level = 3
  227.             upgrade_sound.play()
  228.             #增加5架小型敌机,3架中,2架大
  229.             add_small_enemies(small_enemies,enemies,5)   #添加3个小型飞机
  230.             add_mid_enemies(mid_enemies,enemies,3)
  231.             add_big_enemies(big_enemies,enemies,2)

  232.             #提升小型飞机的速度
  233.             inc_speed(small_enemies,1)
  234.             inc_speed(mid_enemies,1)

  235.         elif level ==3 and score >60000:
  236.             level = 4
  237.             upgrade_sound.play()
  238.             #增加5架小型敌机,3架中,2架大
  239.             add_small_enemies(small_enemies,enemies,7)   #添加3个小型飞机
  240.             add_mid_enemies(mid_enemies,enemies,4)
  241.             add_big_enemies(big_enemies,enemies,3)

  242.             #提升小型飞机的速度
  243.             inc_speed(small_enemies,1)
  244.             inc_speed(mid_enemies,1)
  245.             
  246.         elif level == 4 and score >100000:
  247.             level = 5
  248.             upgrade_sound.play()
  249.             #增加5架小型敌机,3架中,2架大
  250.             add_small_enemies(small_enemies,enemies,10)   #添加3个小型飞机
  251.             add_mid_enemies(mid_enemies,enemies,6)
  252.             add_big_enemies(big_enemies,enemies,4)

  253.             #提升小型飞机的速度
  254.             inc_speed(small_enemies,1)
  255.             inc_speed(mid_enemies,1)
  256.         
  257.             
  258.         if not paused:
  259.             #获取用户的键盘操作,当键盘操作频繁时,建议使用这种方式获取键盘
  260.             key_pressed = pygame.key.get_pressed()
  261.             
  262.             if key_pressed[K_w] or key_pressed[K_UP]:  #按下w或者方向键
  263.                 me.moveUp()
  264.             if key_pressed[K_s] or key_pressed[K_DOWN]:  #按下w或者方向键
  265.                 me.moveDown()
  266.             if key_pressed[K_a] or key_pressed[K_LEFT]:  #按下w或者方向键
  267.                 me.moveLeft()
  268.             if key_pressed[K_d] or key_pressed[K_RIGHT]:  #按下w或者方向键
  269.                 me.moveRight()
  270.       

  271.             #绘制全屏炸弹补给并检测玩家是否获得
  272.             if bomb_supply.active:
  273.                 bomb_supply.move()
  274.                 screen.blit(bomb_supply.image,bomb_supply.rect)
  275.                 #此处调用的函数为检测非透明部分是否发生碰撞,在子弹补给定义时,已经调用了相关的mask函数
  276.                 if pygame.sprite.collide_mask(bomb_supply,me):
  277.                     get_bomb_sound.play()
  278.                     if bomb_num < 3:
  279.                         bomb_num += 1
  280.                     bomb_supply.active = False  #设置为false,图片消失

  281.                     

  282.             #绘制超级子弹补给并检测玩家是否获得
  283.             if bullet_supply.active:
  284.                 bullet_supply.move()
  285.                 screen.blit(bullet_supply.image,bullet_supply.rect)
  286.                 #此处调用的函数为检测非透明部分是否发生碰撞,在子弹补给定义时,已经调用了相关的mask函数
  287.                 if pygame.sprite.collide_mask(bullet_supply,me):
  288.                     get_bullet_sound.play()
  289.                     #发射超级子弹
  290.                     is_double_bullet =True
  291.                     pygame.time.set_timer(DOUBLE_BULLET_TIME,15 * 1000)
  292.                     bullet_supply.active = False  #设置为false,图片消失      


  293.             
  294.             #发射子弹
  295.             if not (delay % 10):
  296.                 bullet_sound.play()
  297.                 if is_double_bullet:
  298.                     bullets = bullet2
  299.                     bullets[bullet2_index].reset((me.rect.centerx-33,me.rect.centery))
  300.                     bullets[bullet2_index+1].reset((me.rect.centerx+33,me.rect.centery))
  301.                     bullet2_index = (bullet2_index + +2)% BULLEF2_NUM
  302.                   
  303.                 else:
  304.                     bullets = bullet1
  305.                     bullets[bullet1_index].reset(me.rect.midtop)
  306.                     bullet1_index = (bullet1_index + 1)% BULLEF1_NUM  #总共四个子弹,index从0,1,2,3



  307.             #检测子弹是否击中敌人的飞机
  308.             for b in bullets:
  309.                 if b.active:
  310.                     b.move()
  311.                     screen.blit(b.image,b.rect)
  312.                     #enemy_hit存放,被子弹打中的敌人飞机
  313.                     enemy_hit = pygame.sprite.spritecollide(b,enemies,False)
  314.                     if enemy_hit:   #不为空,表示有飞机被打中
  315.                         b.active = False
  316.                         for e in enemy_hit:
  317.                             if e in mid_enemies or e in big_enemies:
  318.                                 e.hit = True
  319.                                 e.energy -= 1
  320.                                 if e.energy == 0:
  321.                                     e.active = False
  322.                             else:
  323.                                 e.active  = False  #小型敌人飞机被击中,直接挂掉
  324.                            
  325.                         


  326.                     
  327.             #切换图片
  328.             if not(delay % 5):   #每五帧切换一次
  329.                 switch_image =  not switch_image  

  330.             delay -= 1
  331.             if not delay:   #如果delay为0
  332.                 delay == 100


  333.             #绘制大型飞机
  334.             for each in big_enemies:
  335.                 if each.active:
  336.                     each.enemy_move()
  337.                     if each.hit:
  338.                         screen.blit(each.image_hit,each.rect)
  339.                         each.hit = False
  340.                     if switch_image:
  341.                         screen.blit(each.image1,each.rect)
  342.                     else:
  343.                         screen.blit(each.image2,each.rect)
  344.                         #大型飞机即将出现前,添加音效
  345.                         if each.rect.bottom ==  -50:
  346.                             enemy3_fly_sound.play(-1)
  347.                            
  348.                     #绘制血槽
  349.                     pygame.draw.line(screen,BLACK,\
  350.                                      (each.rect.left,each.rect.top - 5),\
  351.                                      (each.rect.right,each.rect.top - 5),\
  352.                                      2)   #两个像素的宽度

  353.                     #当生命大于20%显示绿色,否则显示红色
  354.                     energy_remain= each.energy / enemy.Bigenemy.energy
  355.                     if energy_remain > 0.2:
  356.                         energy_color = GREEN
  357.                     else:
  358.                         energy_color = RED
  359.                     pygame.draw.line(screen,energy_color,\
  360.                                      (each.rect.left,each.rect.top - 5),\
  361.                                      (each.rect.left + each.rect.width * energy_remain , each.rect.top - 5),\
  362.                                       2)
  363.                                     

  364.                         
  365.                 else:
  366.                    #毁灭,总共有6张图片,每循环显示6张之后,重置,重从屏幕上方出现
  367.                   
  368.                    if not(delay % 3):
  369.                       if e3_destroy_index == 0:
  370.                          enemy3_down_sound.play()
  371.                       screen.blit(each.destroy_images[e3_destroy_index],each.rect)
  372.                       e3_destroy_index = (e3_destroy_index+1) % 6
  373.                       if e3_destroy_index == 0:
  374.                           enemy3_fly_sound.stop()
  375.                           score += 10000
  376.                           each.reset()

  377.             #检测我方飞机是否被撞
  378.             enemies_down = pygame.sprite.spritecollide(me, enemies, False)
  379.             if enemies_down:
  380.                 me.active = False
  381.                 for e in enemies_down:
  382.                     e.active = False
  383.                     
  384.             #绘制中型飞机
  385.             for each in mid_enemies:
  386.                if each.active:
  387.                     each.enemy_move()
  388.                     if each.hit:
  389.                         screen.blit(each.image_hit,each.rect)
  390.                         each.hit = False
  391.                     else:
  392.                         screen.blit(each.image,each.rect)

  393.                     #绘制血槽
  394.                     pygame.draw.line(screen,BLACK,\
  395.                                      (each.rect.left,each.rect.top - 5),\
  396.                                      (each.rect.right,each.rect.top - 5),\
  397.                                      2)   #两个像素的宽度

  398.                     #当生命大于20%显示绿色,否则显示红色
  399.                     energy_remain= each.energy / enemy.Midenemy.energy
  400.                     if energy_remain > 0.2:
  401.                         energy_color = GREEN
  402.                     else:
  403.                         energy_color = RED
  404.                     pygame.draw.line(screen,energy_color,\
  405.                                      (each.rect.left,each.rect.top - 5),\
  406.                                      (each.rect.left + each.rect.width*energy_remain,each.rect.top - 5),\
  407.                                       2)
  408.                                     
  409.                else:
  410.                   
  411.                    if not(delay % 3):
  412.                       if e2_destroy_index == 0:
  413.                           enemy2_down_sound.play()
  414.                       screen.blit(each.destroy_images[e2_destroy_index],each.rect)
  415.                       e2_destroy_index = (e2_destroy_index+1) % 4
  416.                       if e2_destroy_index == 0:
  417.                           score += 6000
  418.                           each.reset()


  419.             #绘制小型飞机
  420.             for each in small_enemies:
  421.                 if each.active:
  422.                     each.enemy_move()
  423.                     screen.blit(each.image,each.rect)
  424.                 else:
  425.                     #毁灭
  426.                     if not(delay % 3):
  427.                       if e1_destroy_index == 0:
  428.                           enemy1_down_sound.play()
  429.                       screen.blit(each.destroy_images[e1_destroy_index],each.rect)
  430.                       e1_destroy_index = (e1_destroy_index+1) % 4
  431.                       if e1_destroy_index == 0:
  432.                           score += 1000
  433.                           each.reset()

  434.             #绘制我方飞机
  435.             if me.active:
  436.                 switch_image = not switch_image  #取反,实现不断切换
  437.                 if switch_image:
  438.                     screen.blit(me.image1,me.rect)
  439.                 else:
  440.                     screen.blit(me.image2,me.rect)
  441.             else:

  442.                 #毁灭
  443.                 screen.blit(over_image,((width // 2)-130 ,height // 2))
  444.                 screen.blit(again_image,((width // 2)-130 ,(height // 2)+50))
  445.                 if not(delay % 3):
  446.                       if me_destroy_index == 0:
  447.                           me_down_sound.play()
  448.                       screen.blit(me.destroy_images[me_destroy_index],me.rect)
  449.                       me_destroy_index = (me_destroy_index+1) % 4
  450.                       life_num -= 1
  451.                       if life_num == 0:
  452.                             running = False
  453.                      
  454.                           
  455.                      
  456.                                     
  457.                           
  458.             #绘制剩余全屏炸弹数量
  459.             bomb_text = bomb_font.render("× %d" % bomb_num,True,WHITE)
  460.             text_rect = bomb_text.get_rect()
  461.             screen.blit(bomb_image,(10,height - 10 - bomb_rect.height ))
  462.             screen.blit(bomb_text,(20+bomb_rect.width,height - 5 - text_rect.height ))


  463.             #绘制剩余生命
  464.             life_text = life_font.render("× %d" % life_num,True,WHITE)
  465.             life_text_rect = life_text.get_rect()
  466.             screen.blit(life_image,(width-140,height - 10 - life_rect.height ))
  467.             screen.blit(life_text,(width-80 ,height - 5 - life_text_rect.height ))
  468.             

  469.             
  470.         #绘制得分
  471.         score_text = score_font.render("Score: %s" %str(score),True,WHITE)
  472.         screen.blit(score_text,(10,5))

  473.         #绘制暂停按钮
  474.         screen.blit(pause_image,paused_rect)
  475.    
  476.             
  477.         pygame.display.flip()
  478.         clock.tick(60)
  479.         
  480.         
  481.    


  482. if __name__ =="__main__":
  483.     #在双击打开文件时,如果出现异常,将异常显示出来
  484.     try:
  485.         main()
  486.     except SystemExit:
  487.         pass
  488.     except:
  489.         traceback.print_exc()
  490.         pygame.quit()
  491.         input()

复制代码















想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1

GMT+8, 2020-6-2 19:27

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表