鱼C论坛

 找回密码
 立即注册
查看: 796|回复: 2

[已解决]小甲鱼的飞机大战 超级子弹没有显示

[复制链接]
发表于 2020-4-28 10:51:25 | 显示全部楼层 |阅读模式

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

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

x
这是我的主程序代码 一旦飞机接到超级子弹补给
就不显示子弹了 自己找了半天的错
就是不知道哪里漏写了什么或者哪里不对
  1. import pygame
  2. import sys
  3. import traceback
  4. import myplane
  5. import enemy
  6. import bullet
  7. import supply
  8. from pygame.locals import *
  9. from random import *
  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('images/background.png').convert()
  16. BLACK = (0,0,0)
  17. WHITE = (255,255,255)
  18. GREEN = (0,255,0)
  19. RED = (255,0,0)
  20. pygame.mixer.music.load("sound/game_music.ogg")
  21. pygame.mixer.music.set_volume(0.2)
  22. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  23. bullet_sound.set_volume(0.2)
  24. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  25. bomb_sound.set_volume(0.2)
  26. supply_sound = pygame.mixer.Sound("sound/supply.wav")
  27. supply_sound.set_volume(0.2)
  28. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  29. get_bomb_sound.set_volume(0.2)
  30. get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
  31. get_bullet_sound.set_volume(0.2)
  32. upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
  33. upgrade_sound.set_volume(0.2)
  34. enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
  35. enemy3_fly_sound.set_volume(0.2)
  36. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  37. enemy1_down_sound.set_volume(0.2)
  38. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  39. enemy2_down_sound.set_volume(0.2)
  40. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  41. enemy3_down_sound.set_volume(0.5)
  42. me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
  43. me_down_sound.set_volume(0.2)
  44. def add_small_enemies(group1,group2,num):
  45.     for i in range(num):
  46.         e1 = enemy.SmallEnemy(bg_size)
  47.         group1.add(e1)
  48.         group2.add(e1)
  49. def add_mid_enemies(group1,group2,num):
  50.     for i in range(num):
  51.         e2 = enemy.MidEnemy(bg_size)
  52.         group1.add(e2)
  53.         group2.add(e2)
  54. def add_big_enemies(group1,group2,num):
  55.     for i in range(num):
  56.         e3 = enemy.BigEnemy(bg_size)
  57.         group1.add(e3)
  58.         group2.add(e3)
  59. def inc_speed(target, inc):
  60.     for each in target:
  61.         each.speed += inc
  62. def main():
  63.     pygame.mixer.music.play(-1)
  64.     me = myplane.MyPlane(bg_size)
  65.     enemies = pygame.sprite.Group()
  66.     small_enemies = pygame.sprite.Group()
  67.     add_small_enemies(small_enemies,enemies,15)
  68.     mid_enemies = pygame.sprite.Group()
  69.     add_mid_enemies(mid_enemies,enemies,4)
  70.     big_enemies = pygame.sprite.Group()
  71.     add_big_enemies(big_enemies,enemies,2)
  72.     bullet1 = []
  73.     bullet1_index = 0
  74.     BULLET1_NUM = 4
  75.     for i in range(BULLET1_NUM):
  76.         bullet1.append(bullet.Bullet1(me.rect.midtop))
  77.     bullet2 = []
  78.     bullet2_index = 0
  79.     BULLET2_NUM = 8
  80.     for i in range(BULLET2_NUM // 2):
  81.         bullet2.append(bullet.Bullet2((me.rect.centerx-33, me.rect.centery)))
  82.         bullet2.append(bullet.Bullet2((me.rect.centerx+30, me.rect.centery)))
  83.     clock = pygame.time.Clock()
  84.     e1_destroy_index = 0
  85.     e2_destroy_index = 0
  86.     e3_destroy_index = 0
  87.     me_destroy_index = 0
  88.     score = 0
  89.     score_font = pygame.font.Font('font/font.ttf',36)
  90.     paused = False
  91.     pause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha()
  92.     pause_pressed_image = pygame.image.load('images/pause_pressed.png').convert_alpha()
  93.     resume_nor_image = pygame.image.load('images/resume_nor.png').convert_alpha()
  94.     resume_pressed_image = pygame.image.load('images/resume_pressed.png').convert_alpha()
  95.     paused_rect = pause_nor_image.get_rect()
  96.     paused_rect.left,paused_rect.top = width - paused_rect.width - 10,10
  97.     paused_image = pause_nor_image
  98.     level = 1
  99.     bomb_image = pygame.image.load("images/bomb.png").convert_alpha()
  100.     bomb_rect = bomb_image.get_rect()
  101.     bomb_font = pygame.font.Font("font/font.ttf", 48)
  102.     bomb_num = 3
  103.     bullet_supply = supply.Bullet_Supply(bg_size)
  104.     bomb_supply = supply.Bomb_Supply(bg_size)
  105.     SUPPLY_TIME = USEREVENT
  106.     pygame.time.set_timer(SUPPLY_TIME,30 * 1000)
  107.     DOUBLE_BULLET_TIME = USEREVENT + 1
  108.     is_double_bullet = False
  109.     switch_image = True
  110.     delay = 100
  111.     running = True
  112.     while running:
  113.         for event in pygame.event.get():
  114.             if event.type == QUIT:
  115.                 sys.exit()
  116.             elif event.type == MOUSEBUTTONDOWN:
  117.                 if event.button == 1 and paused_rect.collidepoint(event.pos):
  118.                     paused = not paused
  119.                     if paused:
  120.                         pygame.time.set_timer(SUPPLY_TIME, 0)
  121.                         pygame.mixer.music.pause()
  122.                         pygame.mixer.pause()
  123.                     else:
  124.                         pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
  125.                         pygame.mixer.music.unpause()
  126.                         pygame.mixer.unpause()
  127.             elif event.type == MOUSEMOTION:
  128.                 if paused_rect.collidepoint(event.pos):
  129.                     if paused:
  130.                         paused_image = resume_pressed_image
  131.                     else:
  132.                         paused_image = pause_pressed_image
  133.                 else:
  134.                     if paused:
  135.                         paused_image = resume_nor_image
  136.                     else:
  137.                        paused_image = pause_nor_image
  138.             elif event.type == KEYDOWN:
  139.                 if event.key == K_SPACE:
  140.                     if bomb_num:
  141.                         bomb_num -= 1
  142.                         bomb_sound.play()
  143.                         for each in enemies:
  144.                             if each.rect.bottom > 0:
  145.                                 each.active = False
  146.             elif event.type == SUPPLY_TIME:
  147.                 supply_sound.play()
  148.                 if choice([True,False]):
  149.                     bomb_supply.reset()
  150.                 else:
  151.                     bullet_supply.reset()
  152.             elif event.type == DOUBLE_BULLET_TIME:
  153.                 is_double_bullet = False
  154.                 pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)
  155.         if level == 1 and score > 50000:
  156.             level = 2
  157.             upgrade_sound.play()
  158.             add_small_enemies(small_enemies,enemies,3)
  159.             add_mid_enemies(mid_enemies,enemies,2)
  160.             add_big_enemies(big_enemies,enemies,1)
  161.             inc_speed(small_enemies,1)
  162.         elif level == 1 and score > 300000:
  163.             level = 2
  164.             upgrade_sound.play()
  165.             add_small_enemies(small_enemies,enemies,5)
  166.             add_mid_enemies(mid_enemies,enemies,3)
  167.             add_big_enemies(big_enemies,enemies,2)
  168.             inc_speed(small_enemies,1)
  169.             inc_speed(mid_enemies,1)
  170.         elif level == 3 and score > 600000:
  171.             level = 4
  172.             upgrade_sound.play()
  173.             add_small_enemies(small_enemies,enemies,5)
  174.             add_mid_enemies(mid_enemies,enemies,3)
  175.             add_big_enemies(big_enemies,enemies,2)
  176.             inc_speed(small_enemies,1)
  177.             inc_speed(mid_enemies,1)
  178.         elif level == 4 and score > 1000000:
  179.             level = 5
  180.             upgrade_sound.play()
  181.             add_small_enemies(small_enemies,enemies,5)
  182.             add_mid_enemies(mid_enemies,enemies,3)
  183.             add_big_enemies(big_enemies,enemies,2)
  184.             inc_speed(small_enemies,1)
  185.             inc_speed(mid_enemies,1)
  186.         screen.blit(background,(0,0))
  187.         if not paused:
  188.             key_pressed = pygame.key.get_pressed()
  189.             if key_pressed[K_w] or key_pressed[K_UP]:
  190.                 me.moveUp()
  191.             if key_pressed[K_s] or key_pressed[K_DOWN]:
  192.                 me.moveDown()
  193.             if key_pressed[K_a] or key_pressed[K_LEFT]:
  194.                 me.moveLeft()
  195.             if key_pressed[K_d] or key_pressed[K_RIGHT]:
  196.                 me.moveRight()
  197.             if bomb_supply.active:
  198.                 bomb_supply.move()
  199.                 screen.blit(bomb_supply.image, bomb_supply.rect)
  200.                 if pygame.sprite.collide_mask(bomb_supply, me):
  201.                     get_bomb_sound.play()
  202.                     if bomb_num < 3:
  203.                         bomb_num += 1
  204.                     bomb_supply.active = False
  205.             if bullet_supply.active:
  206.                 bullet_supply.move()
  207.                 screen.blit(bullet_supply.image, bullet_supply.rect)
  208.                 if pygame.sprite.collide_mask(bullet_supply, me):
  209.                     get_bullet_sound.play()
  210.                     is_double_bullet = True
  211.                     pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
  212.                     bullet_supply.active = False
  213.             if not(delay % 10):
  214.                 bullet_sound.play()
  215.                 if is_double_bullet:
  216.                     bullets = bullet2
  217.                     bullets[bullet2_index].reset((me.rect.centerx-33, me.rect.centery))
  218.                     bullets[bullet2_index + 1].reset((me.rect.centerx+30, me.rect.centery))
  219.                     bullet2_index = (bullet2_index + 2) % BULLET2_NUM
  220.                 else:
  221.                     bullets = bullet1
  222.                     bullets[bullet1_index].reset(me.rect.midtop)
  223.                     bullet1_index = (bullet1_index + 1) % BULLET1_NUM
  224.             for b in bullet1:
  225.                 if b.active:
  226.                     b.move()
  227.                     screen.blit(b.image,b.rect)
  228.                     enemy_hit = pygame.sprite.spritecollide(b,enemies,False,pygame.sprite.collide_mask)
  229.                     if enemy_hit:
  230.                         b.active = False
  231.                         for e in enemy_hit:
  232.                             if e in mid_enemies or e in big_enemies:
  233.                                 e.hit = True
  234.                                 e.energy -= 1
  235.                                 if e.energy == 0:
  236.                                     e.active = False
  237.                             else:
  238.                                 e.active = False
  239.             for each in big_enemies:
  240.                 if each.active:
  241.                     each.move()
  242.                     if each.hit:
  243.                         screen.blit(each.image_hit,each.rect)
  244.                         each.hit = False
  245.                     else:
  246.                         if switch_image:
  247.                             screen.blit(each.image1,each.rect)
  248.                         else:
  249.                             screen.blit(each.image2,each.rect)
  250.                     pygame.draw.line(screen,BLACK,\
  251.                         (each.rect.left,each.rect.top - 5),\
  252.                         (each.rect.right,each.rect.top - 5),\
  253.                         2)
  254.                     energy_remain = each.energy / enemy.BigEnemy.energy
  255.                     if energy_remain > 0.2:
  256.                         energy_color = GREEN
  257.                     else:
  258.                         energy_color = RED
  259.                     pygame.draw.line(screen,energy_color,\
  260.                         (each.rect.left,each.rect.top - 5),\
  261.                         (each.rect.left + each.rect.width * energy_remain,\
  262.                             each.rect.top - 5),2)
  263.                     if each.rect.bottom == -50:
  264.                         enemy3_fly_sound.play(-1)
  265.                 else:
  266.                     if not (delay % 3):
  267.                         if e3_destroy_index == 0:
  268.                             enemy3_down_sound.play()
  269.                         screen.blit(each.destroy_images[e3_destroy_index],each.rect)
  270.                         e3_destroy_index = (e3_destroy_index + 1) % 6
  271.                         if e3_destroy_index == 0:
  272.                             enemy3_fly_sound.stop()
  273.                             score += 10000
  274.                             each.reset()
  275.             for each in mid_enemies:
  276.                 if each.active:
  277.                     each.move()
  278.                     if each.hit:
  279.                         screen.blit(each.image_hit,each.rect)
  280.                         each.hit = False
  281.                     else:
  282.                         screen.blit(each.image,each.rect)
  283.                     pygame.draw.line(screen,BLACK,\
  284.                         (each.rect.left,each.rect.top - 5),\
  285.                         (each.rect.right,each.rect.top - 5),\
  286.                         2)
  287.                     energy_remain = each.energy / enemy.MidEnemy.energy
  288.                     if energy_remain > 0.2:
  289.                         energy_color = GREEN
  290.                     else:
  291.                         energy_color = RED
  292.                     pygame.draw.line(screen,energy_color,\
  293.                         (each.rect.left,each.rect.top - 5),\
  294.                         (each.rect.left + each.rect.width * energy_remain,\
  295.                             each.rect.top - 5),2)
  296.                 else:
  297.                     if not (delay % 3):
  298.                         if e2_destroy_index == 0:
  299.                             enemy2_down_sound.play()
  300.                         screen.blit(each.destroy_images[e2_destroy_index],each.rect)
  301.                         e2_destroy_index = (e2_destroy_index + 1) % 4
  302.                         if e2_destroy_index == 0:
  303.                             score += 6000
  304.                             each.reset()
  305.             for each in small_enemies:
  306.                 if each.active:
  307.                     each.move()
  308.                     screen.blit(each.image,each.rect)
  309.                 else:
  310.                     if not (delay % 3):
  311.                         if e1_destroy_index == 0:
  312.                             enemy1_down_sound.play()
  313.                         screen.blit(each.destroy_images[e1_destroy_index],each.rect)
  314.                         e1_destroy_index = (e1_destroy_index + 1) % 4
  315.                         if e1_destroy_index == 0:
  316.                             score += 1000
  317.                             each.reset()
  318.             enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
  319.             if enemies_down:
  320.                 #me.active = False
  321.                 for e in enemies_down:
  322.                     e.active = False
  323.             if me.active:
  324.                 if switch_image:
  325.                     screen.blit(me.image1,me.rect)
  326.                 else:
  327.                     screen.blit(me.image2,me.rect)
  328.             else:
  329.                 me_down_sound.play()
  330.                 if not (delay % 3):
  331.                     screen.blit(me.destroy_images[me_destroy_index],me.rect)
  332.                     me_destroy_index = (me_destroy_index + 1) % 4
  333.                     if me_destroy_index == 0:
  334.                         print('Game Over!')
  335.                         running = False
  336.             bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE)
  337.             text_rect = bomb_text.get_rect()
  338.             screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
  339.             screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))
  340.         score_text = score_font.render('Score : %s'% str(score),True,WHITE)
  341.         screen.blit(score_text,(10,5))
  342.         screen.blit(paused_image,paused_rect)
  343.         if not(delay % 5):
  344.             switch_image = not switch_image
  345.         delay -= 1
  346.         if not delay:
  347.             delay = 100
  348.         pygame.display.flip()
  349.         clock.tick(60)
  350. if __name__ == '__main__':
  351.     try:
  352.         main()
  353.     except SystemExit:
  354.         pass
  355.     except:
  356.         traceback.print_exc()
  357.         pygame.quit()
  358.         input()
复制代码
最佳答案
2020-4-28 11:00:24
感觉是224行的
  1. for b in bullet1:
复制代码
导致你的子弹列表只取了普通子弹的,而你自前一小节代码里已经做了判断两种子弹的状态并且赋值给bullets了,结果下面bullet1却没有改过来,所以这段改成
  1. for b in bullets:
复制代码
试试。
另外,你的代码全部挤成一块可读性非常糟糕,建议在写不同的功能和对象的时候稍微空开一两行并加上注释告诉别人也告诉自己这一段是用来干什么的。

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
焦健鬼 + 5 + 5 + 3

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-4-28 11:00:24 | 显示全部楼层    本楼为最佳答案   
感觉是224行的
  1. for b in bullet1:
复制代码
导致你的子弹列表只取了普通子弹的,而你自前一小节代码里已经做了判断两种子弹的状态并且赋值给bullets了,结果下面bullet1却没有改过来,所以这段改成
  1. for b in bullets:
复制代码
试试。
另外,你的代码全部挤成一块可读性非常糟糕,建议在写不同的功能和对象的时候稍微空开一两行并加上注释告诉别人也告诉自己这一段是用来干什么的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-28 11:04:56 | 显示全部楼层
Hoiste 发表于 2020-4-28 11:00
感觉是224行的导致你的子弹列表只取了普通子弹的,而你自前一小节代码里已经做了判断两种子弹的状态并且赋 ...

果然如此
谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-18 11:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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