鱼C论坛

 找回密码
 立即注册
查看: 870|回复: 4

[已解决]pygame飞机大战代码的问题

[复制链接]
发表于 2018-12-9 22:43:45 | 显示全部楼层 |阅读模式

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

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

x
跟着小甲鱼视频092做的代码,关于音效部分有点问题,我检查了一下我的代码好像是和小甲鱼的一样的,但是每次我方飞机和敌机碰撞的时候,两架飞机的碰撞音效会重复播放,永远不会停止。希望大神能帮我看一下问题出在哪。以下是main函数:
  1. import pygame
  2. import sys
  3. import traceback
  4. import myplane
  5. import enemy
  6. from pygame.locals import *

  7. pygame.init()
  8. pygame.mixer.init()

  9. # 设定屏幕尺寸、名字
  10. bg_size = width, height = 480, 700
  11. screen = pygame.display.set_mode(bg_size)
  12. pygame.display.set_caption("飞机大战 -- FishC Demo")

  13. # 载入背景图片
  14. background = pygame.image.load("images/background.png").convert()

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

  40. # 定义添加三类敌机的三个函数。
  41. def add_small_enemies(group1, group2, num):
  42.     for i in range(num):
  43.         e1 = enemy.SmallEnemy(bg_size)
  44.         group1.add(e1)
  45.         group2.add(e1)

  46. def add_mid_enemies(group1, group2, num):
  47.     for i in range(num):
  48.         e2 = enemy.MidEnemy(bg_size)
  49.         group1.add(e2)
  50.         group2.add(e2)

  51. def add_big_enemies(group1, group2, num):
  52.     for i in range(num):
  53.         e3 = enemy.BigEnemy(bg_size)
  54.         group1.add(e3)
  55.         group2.add(e3)

  56. #定义main主函数
  57. def main():
  58.     pygame.mixer.music.play(-1)

  59.     # 生成我方飞机
  60.     me = myplane.MyPlane(bg_size)

  61.     # 创建一个敌机的精灵组
  62.     enemies = pygame.sprite.Group()

  63.     # 生成15个敌方小型飞机
  64.     small_enemies = pygame.sprite.Group()
  65.     add_small_enemies(small_enemies, enemies, 15)

  66.     # 生成4个敌方中型飞机
  67.     mid_enemies = pygame.sprite.Group()
  68.     add_mid_enemies(mid_enemies, enemies, 4)

  69.     # 生成2个敌方大型飞机
  70.     big_enemies = pygame.sprite.Group()
  71.     add_big_enemies(big_enemies, enemies, 2)

  72.     clock = pygame.time.Clock()

  73.     # 各飞机中弹图片索引
  74.     e1_destroy_index = 0
  75.     e2_destroy_index = 0
  76.     e3_destroy_index = 0
  77.     me_destroy_index = 0

  78.     switch_image = True

  79.     delay = 100

  80.     running = True

  81.     while running:
  82.         for event in pygame.event.get():
  83.             if event.type == QUIT:
  84.                 pygame.quit()
  85.                 sys.exit()

  86.         # 检测用户的键盘操作。
  87.         key_pressed = pygame.key.get_pressed()
  88.         if key_pressed[K_w] or key_pressed[K_UP]:
  89.             me.moveUp()
  90.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  91.             me.moveDown()
  92.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  93.             me.moveLeft()
  94.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  95.             me.moveRight()

  96.         # 画上背景
  97.         screen.blit(background, (0, 0))

  98.         # 绘制大型敌机。
  99.         for each in big_enemies:
  100.             if each.active:
  101.                 each.move()
  102.                 if switch_image:
  103.                     screen.blit(each.image1, each.rect)
  104.                 else:
  105.                     screen.blit(each.image2, each.rect)
  106.                 if each.rect.bottom > -50:
  107.                     enemy3_fly_sound.play(-1)
  108.             else:
  109.                 if not(delay % 3):
  110.                     if e3_destroy_index == 0:
  111.                         enemy3_down_sound.play()
  112.                     screen.blit(each.destroy_images[e3_destroy_index], each.rect)
  113.                     e3_destroy_index = (e3_destroy_index + 1) % 6
  114.                    if e3_destroy_index == 0:
  115.                         me_down_sound.stop()
  116.                         each.reset()

  117.         # 绘制中型敌机:
  118.         for each in mid_enemies:
  119.             if each.active:
  120.                 each.move()
  121.                 screen.blit(each.image, each.rect)
  122.             else:
  123.                 # 毁灭
  124.                 if not (delay % 3):
  125.                     if e2_destroy_index == 0:
  126.                         enemy2_down_sound.play()
  127.                     screen.blit(each.destroy_images[e2_destroy_index], each.rect)
  128.                     e2_destroy_index = (e2_destroy_index + 1) % 4
  129.                     if e2_destroy_index == 0:
  130.                         each.reset()

  131.         # 绘制小型敌机:
  132.         for each in small_enemies:
  133.             if each.active:
  134.                 each.move()
  135.                 screen.blit(each.image, each.rect)
  136.             else:
  137.                 # 毁灭
  138.                 if not (delay % 3):
  139.                     if e1_destroy_index == 0:
  140.                         enemy1_down_sound.play()
  141.                     screen.blit(each.destroy_images[e1_destroy_index], each.rect)
  142.                     e1_destroy_index = (e1_destroy_index + 1) % 4
  143.                     if e1_destroy_index == 0:
  144.                         each.reset()

  145.         enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
  146.         if enemies_down:
  147.             #me.active = False
  148.             for e in enemies_down:
  149.                 e.active = False

  150.         # 绘制我方飞机。
  151.         if me.active:
  152.             if switch_image:
  153.                 screen.blit(me.image1, me.rect)
  154.             else:
  155.                 screen.blit(me.image2, me.rect)
  156.         else:
  157.         # 毁灭。
  158.             if not (delay % 3):
  159.                 if me_destroy_index == 0:
  160.                     me_down_sound.play()
  161.                 screen.blit(me.destroy_images[me_destroy_index], me.rect)
  162.                 me_destroy_index = (me_destroy_index + 1) % 4
  163.                 if me_destroy_index == 0:
  164.                     print("Game Over!")
  165.                     running = False

  166.         if not(delay % 5):
  167.             switch_image = not switch_image

  168.         delay -= 1
  169.         if not delay:
  170.             delay = 100

  171.         pygame.display.flip()
  172.         clock.tick(60)

  173. if __name__ == "__main__":
  174.     try:
  175.         main()
  176.     except SystemExit:
  177.         pass
  178.     except:
  179.         traceback.print_exc()
  180.         pygame.quit()
  181.         input()


复制代码
最佳答案
2018-12-10 20:37:37
                if not(delay % 3):
                    if e3_destroy_index == 0:
                        enemy3_down_sound.play()
                    screen.blit(each.destroy_images[e3_destroy_index], each.rect)
                    e3_destroy_index = (e3_destroy_index + 1) % 6
                   if e3_destroy_index == 0:
                        me_down_sound.stop()
                        each.reset()
你这里缩进好像有点问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-9 23:08:23 | 显示全部楼层
没看见你碰撞检测的,不知道你怎么识别
if e3_destroy_index == 0:
                        me_down_sound.stop()
                        each.reset()
大飞机这里有个stop(),但是音乐是不是错了
其他几个飞机没有stop()
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-10 12:03:36 | 显示全部楼层
因为飞机爆炸的画面不止一帧,然后……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-10 20:24:25 | 显示全部楼层
塔利班 发表于 2018-12-9 23:08
没看见你碰撞检测的,不知道你怎么识别
if e3_destroy_index == 0:
                        me_down_sou ...

碰撞检测是用sprite模块的collide_mask()函数做的。
小甲鱼的源代码好像也是这样的,不知道为什么就不会循环播放音效。

他的代码:
  1. # main.py
  2. import pygame
  3. import sys
  4. import traceback
  5. import myplane
  6. import enemy

  7. from pygame.locals import *
  8. from random import *

  9. pygame.init()
  10. pygame.mixer.init()

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

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

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


  40. def add_small_enemies(group1, group2, num):
  41.     for i in range(num):
  42.         e1 = enemy.SmallEnemy(bg_size)
  43.         group1.add(e1)
  44.         group2.add(e1)

  45. def add_mid_enemies(group1, group2, num):
  46.     for i in range(num):
  47.         e2 = enemy.MidEnemy(bg_size)
  48.         group1.add(e2)
  49.         group2.add(e2)

  50. def add_big_enemies(group1, group2, num):
  51.     for i in range(num):
  52.         e3 = enemy.BigEnemy(bg_size)
  53.         group1.add(e3)
  54.         group2.add(e3)
  55.         

  56. def main():
  57.     pygame.mixer.music.play(-1)

  58.     # 生成我方飞机
  59.     me = myplane.MyPlane(bg_size)

  60.     enemies = pygame.sprite.Group()

  61.     # 生成敌方小型飞机
  62.     small_enemies = pygame.sprite.Group()
  63.     add_small_enemies(small_enemies, enemies, 15)

  64.     # 生成敌方中型飞机
  65.     mid_enemies = pygame.sprite.Group()
  66.     add_mid_enemies(mid_enemies, enemies, 4)

  67.     # 生成敌方大型飞机
  68.     big_enemies = pygame.sprite.Group()
  69.     add_big_enemies(big_enemies, enemies, 2)

  70.     clock = pygame.time.Clock()

  71.     # 中弹图片索引
  72.     e1_destroy_index = 0
  73.     e2_destroy_index = 0
  74.     e3_destroy_index = 0
  75.     me_destroy_index = 0

  76.     # 用于切换图片
  77.     switch_image = True

  78.     # 用于延迟
  79.     delay = 100

  80.     running = True

  81.     while running:
  82.         for event in pygame.event.get():
  83.             if event.type == QUIT:
  84.                 pygame.quit()
  85.                 sys.exit()

  86.         # 检测用户的键盘操作
  87.         key_pressed = pygame.key.get_pressed()

  88.         if key_pressed[K_w] or key_pressed[K_UP]:
  89.             me.moveUp()
  90.         if key_pressed[K_s] or key_pressed[K_DOWN]:
  91.             me.moveDown()
  92.         if key_pressed[K_a] or key_pressed[K_LEFT]:
  93.             me.moveLeft()
  94.         if key_pressed[K_d] or key_pressed[K_RIGHT]:
  95.             me.moveRight()
  96.    
  97.         screen.blit(background, (0, 0))

  98.         # 绘制大型敌机
  99.         for each in big_enemies:
  100.             if each.active:
  101.                 each.move()
  102.                 if switch_image:
  103.                     screen.blit(each.image1, each.rect)
  104.                 else:
  105.                     screen.blit(each.image2, each.rect)
  106.                 # 即将出现在画面中,播放音效
  107.                 if each.rect.bottom == -50:
  108.                     enemy3_fly_sound.play(-1)
  109.             else:
  110.                 # 毁灭
  111.                 if not(delay % 3):
  112.                     if e3_destroy_index == 0:
  113.                         enemy3_down_sound.play()
  114.                     screen.blit(each.destroy_images[e3_destroy_index], each.rect)
  115.                     e3_destroy_index = (e3_destroy_index + 1) % 6
  116.                     if e3_destroy_index == 0:
  117.                         me_down_sound.stop()
  118.                         each.reset()

  119.         # 绘制中型敌机:
  120.         for each in mid_enemies:
  121.             if each.active:
  122.                 each.move()
  123.                 screen.blit(each.image, each.rect)
  124.             else:
  125.                 # 毁灭
  126.                 if not(delay % 3):
  127.                     if e2_destroy_index == 0:
  128.                         enemy2_down_sound.play()
  129.                     screen.blit(each.destroy_images[e2_destroy_index], each.rect)
  130.                     e2_destroy_index = (e2_destroy_index + 1) % 4
  131.                     if e2_destroy_index == 0:
  132.                         each.reset()

  133.         # 绘制小型敌机:
  134.         for each in small_enemies:
  135.             if each.active:
  136.                 each.move()
  137.                 screen.blit(each.image, each.rect)
  138.             else:
  139.                 # 毁灭
  140.                 if not(delay % 3):
  141.                     if e1_destroy_index == 0:
  142.                         enemy1_down_sound.play()
  143.                     screen.blit(each.destroy_images[e1_destroy_index], each.rect)
  144.                     e1_destroy_index = (e1_destroy_index + 1) % 4
  145.                     if e1_destroy_index == 0:
  146.                         each.reset()

  147.         # 检测我方飞机是否被撞
  148.         enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
  149.         if enemies_down:
  150.             # me.active = False
  151.             for e in enemies_down:
  152.                 e.active = False
  153.         
  154.         # 绘制我方飞机
  155.         if me.active:
  156.             if switch_image:
  157.                 screen.blit(me.image1, me.rect)
  158.             else:
  159.                 screen.blit(me.image2, me.rect)
  160.         else:
  161.             # 毁灭
  162.             if not(delay % 3):
  163.                 if me_destroy_index == 0:
  164.                     me_down_sound.play()
  165.                 screen.blit(me.destroy_images[me_destroy_index], me.rect)
  166.                 me_destroy_index = (me_destroy_index + 1) % 4
  167.                 if me_destroy_index == 0:
  168.                     print("Game Over!")
  169.                     running = False

  170.         # 切换图片
  171.         if not(delay % 5):
  172.             switch_image = not switch_image

  173.         delay -= 1
  174.         if not delay:
  175.             delay = 100

  176.         pygame.display.flip()
  177.         clock.tick(60)
  178.         
  179. if __name__ == "__main__":
  180.     try:
  181.         main()
  182.     except SystemExit:
  183.         pass
  184.     except:
  185.         traceback.print_exc()
  186.         pygame.quit()
  187.         input()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-10 20:37:37 | 显示全部楼层    本楼为最佳答案   
                if not(delay % 3):
                    if e3_destroy_index == 0:
                        enemy3_down_sound.play()
                    screen.blit(each.destroy_images[e3_destroy_index], each.rect)
                    e3_destroy_index = (e3_destroy_index + 1) % 6
                   if e3_destroy_index == 0:
                        me_down_sound.stop()
                        each.reset()
你这里缩进好像有点问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-30 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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