鱼C论坛

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

[已解决]pygame关于子弹问题

[复制链接]
发表于 2017-7-13 14:45:27 | 显示全部楼层 |阅读模式

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

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

x
我一共设置了6发子弹,可是第一和第二发子弹居然会一起发射,求dalao帮忙看看
I9IQEJ@VBP]($~K{8E2HA{H.png

以下是我的代码
  1.         bullet1=[]
  2.         bullet1_index=0 #子弹索引
  3.         for i in range(6): #定义了6个普通子弹
  4.                 bullet1.append(bullet.Bullet1(me.rect.midtop)) #子弹的初始位置为我方飞机头部正中央
复制代码


然后是加载子弹
  1.                 #子弹装载
  2.                 if not (delay % 10):   #每10帧发射一枚子弹
  3.                         bullet_sound.play()
  4.                         bullet1[bullet1_index].reset(me.rect.midtop)
  5.                         bullet1_index=(bullet1_index + 1) % 6

  6.                 for each in bullet1:
  7.                         if not each.hit:
  8.                                 each.move()
  9.                                 screen.blit(each.image,each.rect)
  10.                                 bullet_hit=pygame.sprite.spritecollide(each,enemies,False,pygame.sprite.collide_mask)
  11.                                 if bullet_hit:
  12.                                         each.hit=True
  13.                                         for i in bullet_hit:
  14.                                                 i.active = False
复制代码


我的普通子弹类如下
  1. import pygame
  2. class Bullet1(pygame.sprite.Sprite):
  3.         def __init__(self,position):
  4.                 pygame.sprite.Sprite.__init__(self)
  5.                 self.image=pygame.image.load('image/bullet1.png').convert_alpha()
  6.                 self.rect=self.image.get_rect()
  7.                 self.speed=[0,-12]
  8.                 self.rect = self.rect.move(self.speed)
  9.                 self.rect.left,self.rect.top=position #将小子弹位置和大飞机绑定
  10.                 self.hit=False #定义子弹是否打中
  11.                 self.mask=pygame.mask.from_surface(self.image)

  12.         def move(self):
  13.                 self.rect = self.rect.move(self.speed)
  14.                 if self.rect.bottom ==0:
  15.                         self.hit=True

  16.         def reset(self,position):
  17.                 self.hit=False
  18.                 self.rect.left,self.rect.top=position
复制代码


主程序代码如下
  1. import sys
  2. import pygame
  3. import traceback
  4. import myplan
  5. import enemy
  6. import bullet
  7. from pygame.locals import *
  8. from random import *
  9. #初始化以及加载背景
  10. pygame.init()
  11. pygame.mixer.init()
  12. clock=pygame.time.Clock()
  13. bg_size=width,height = 400,650
  14. screen=pygame.display.set_mode(bg_size)#创建一个宽600,高四百的窗口
  15. pygame.display.set_caption("飞机大战") #设置标题
  16. background=pygame.image.load('image\\background.png') #加载背景图片

  17. #载入游戏音乐
  18. pygame.mixer.music.load("sound/game_music.wav")
  19. pygame.mixer.music.set_volume(0.2)
  20. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  21. bullet_sound.set_volume(0.2)
  22. big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav")
  23. big_enemy_flying_sound.set_volume(0.1)
  24. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  25. enemy1_down_sound.set_volume(0.2)
  26. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  27. enemy2_down_sound.set_volume(0.2)
  28. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  29. enemy3_down_sound.set_volume(0.2)
  30. me_down_sound = pygame.mixer.Sound("sound/game_over.wav")
  31. me_down_sound.set_volume(0.2)
  32. button_down_sound = pygame.mixer.Sound("sound/button.wav")
  33. button_down_sound.set_volume(0.2)
  34. level_up_sound = pygame.mixer.Sound("sound/achievement.wav")
  35. level_up_sound.set_volume(0.2)
  36. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  37. bomb_sound.set_volume(0.2)
  38. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  39. get_bomb_sound.set_volume(0.2)
  40. get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav")
  41. get_bullet_sound.set_volume(0.2)

  42. #向组中添加大中小飞机函数
  43. def add_small_enemies(group1,group2,num):
  44.         for i in range(num):
  45.                 small_enemie=enemy.SmallEnemy(bg_size)
  46.                 group1.add(small_enemie)
  47.                 group2.add(small_enemie)

  48. def add_mid_enemies(group1,group2,num):
  49.         for i in range(num):
  50.                 mid_enemie=enemy.MidEnemy(bg_size)
  51.                 group1.add(mid_enemie)
  52.                 group2.add(mid_enemie)

  53. def add_big_enemies(group1,group2,num):
  54.         for i in range(num):
  55.                 big_enemie=enemy.BigEnemy(bg_size)
  56.                 group1.add(big_enemie)
  57.                 group2.add(big_enemie)


  58. def main():
  59.         switch_image=False #控制我放飞机两张图片切换的标志位
  60.         delay=60#延迟参数
  61.         pygame.mixer.music.play(-1)
  62.         clock=pygame.time.Clock()
  63.         runnning=True
  64.         me=myplan.MyPlan(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.         for i in range(6): #定义了6个普通子弹
  75.                 bullet1.append(bullet.Bullet1(me.rect.midtop)) #子弹的初始位置为我方飞机头部正中央


  76.         #飞机坠毁图像列表索引
  77.         small_destroy_index = 0
  78.         mid_destroy_index = 0
  79.         big_destroy_index = 0
  80.         me_destroy_index = 0

  81.         while runnning:
  82.                 for event in pygame.event.get():
  83.                         if event.type == QUIT:
  84.                                 pygame.quit()
  85.                                 sys.exit()
  86.                 key_pressed = pygame.key.get_pressed() #通过键盘接受指令,使小飞机上下左右移动
  87.                 if key_pressed[K_UP]:
  88.                         me.speed=[0,-10]
  89.                         me.move()
  90.                 if key_pressed[K_DOWN]:
  91.                         me.speed=[0,10]
  92.                         me.move()
  93.                 if key_pressed[K_LEFT]:
  94.                         me.speed=[-10,0]
  95.                         me.move()
  96.                 if key_pressed[K_RIGHT]:
  97.                         me.speed=[10,0]
  98.                         me.move()

  99.                 screen.blit(background,(0,0)) #背景填充

  100.                 #子弹装载
  101.                 if not (delay % 10):   #每10帧发射一枚子弹
  102.                         bullet_sound.play()
  103.                         bullet1[bullet1_index].reset(me.rect.midtop)
  104.                         bullet1_index=(bullet1_index + 1) % 6

  105.                 for each in bullet1:
  106.                         if not each.hit:
  107.                                 each.move()
  108.                                 screen.blit(each.image,each.rect)
  109.                                 bullet_hit=pygame.sprite.spritecollide(each,enemies,False,pygame.sprite.collide_mask)
  110.                                 if bullet_hit:
  111.                                         each.hit=True
  112.                                         for i in bullet_hit:
  113.                                                 i.active = False

  114.                 #在屏幕上显示大型飞机
  115.                 for each in big_enemies:
  116.                         if each.active:
  117.                                 each.move()
  118.                                 if switch_image:#切换打飞机的图片,造成动态效果
  119.                                         screen.blit(each.image1,each.rect)
  120.                                 else:
  121.                                         screen.blit(each.image2,each.rect)
  122.                                 if each.rect.bottom == -50: #当大飞机即将出现在屏幕上的时候,加载出场音乐
  123.                                         big_enemy_flying_sound.play(-1) #循环播放
  124.                         else:
  125.                                 #坠毁
  126.                                 if not (delay % 3):#每三帧切换一次图片
  127.                                         if big_destroy_index==0:
  128.                                                 enemy3_down_sound.play() #保证每个飞机坠毁只播放一次音效,否则每切换一张坠毁图片就要播放一次
  129.                                         screen.blit(each.destroy_images[big_destroy_index],each.rect)
  130.                                         big_destroy_index = (big_destroy_index+1) % 6 #索引值到6后重新变为1
  131.                                         if big_destroy_index==0:
  132.                                                 big_enemy_flying_sound.stop()
  133.                                                 each.reset()#当坠毁系列图片播放完毕,重置飞机位置

  134.                 #在屏幕上显示中型飞机
  135.                 for each in mid_enemies:
  136.                         if each.active:
  137.                                 each.move()
  138.                                 screen.blit(each.image,each.rect)
  139.                         else:
  140.                                 if not (delay % 3):#每三帧切换一次图片
  141.                                         if mid_destroy_index==0:
  142.                                                 enemy2_down_sound.play()
  143.                                         screen.blit(each.destroy_images[mid_destroy_index],each.rect)
  144.                                         mid_destroy_index = (mid_destroy_index+1) % 4 #索引值到6后重新变为1
  145.                                         if mid_destroy_index==0:
  146.                                                 each.reset()#当坠毁系列图片播放完毕,重置飞机位置

  147.                 #在屏幕上显示小型飞机
  148.                 for each in small_enemies:
  149.                         if each.active:
  150.                                 each.move()
  151.                                 screen.blit(each.image,each.rect)
  152.                         else:
  153.                                 if not (delay % 3):#每三帧切换一次图片
  154.                                         if small_destroy_index==0:
  155.                                                 enemy1_down_sound.play()
  156.                                         screen.blit(each.destroy_images[small_destroy_index],each.rect)
  157.                                         small_destroy_index = (small_destroy_index+1) % 4 #索引值到6后重新变为1
  158.                                         if small_destroy_index==0:
  159.                                                 each.reset()#当坠毁系列图片播放完毕,重置飞机位置

  160.                 #碰撞检测 检测飞机是否坠毁
  161.                 enemies_down=pygame.sprite.spritecollide(me,enemies,False,pygame.sprite.collide_mask)                               
  162.                 if enemies_down:
  163.                         me.active=False  #如果发生了碰撞,我方飞机状态设置为坠毁
  164.                         for each in enemies_down:
  165.                                 each.active=False        #敌方碰撞的精灵全部设置为坠毁       

  166.                 #显示我方飞机
  167.                 if delay==0:
  168.                         delay=60
  169.                 else:
  170.                         delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
  171.                 if not delay % 3:
  172.                         switch_image=not switch_image #每三帧切换一次飞机图片,造成喷气效果
  173.                 if me.active:       
  174.                         if switch_image:
  175.                                 screen.blit(me.image1,me.rect)
  176.                         else:
  177.                                 screen.blit(me.image2,me.rect)
  178.                 else:
  179.                         me_down_sound.play()
  180.                         if not (delay % 3):#每三帧切换一次图片
  181.                                 screen.blit(me.destroy_images[me_destroy_index],me.rect)
  182.                                 me_destroy_index = (me_destroy_index+1) % 4 #索引值到6后重新变为1
  183.                                 if me_destroy_index==0:
  184.                                         me.reset()#当坠毁系列图片播放完毕,重置飞机位置
  185.        
  186.                 pygame.display.flip()#更新界面
  187.                 clock.tick(60)#帧数为60


  188. if __name__=='__main__':
  189.         try:
  190.                 main()
  191.         except SystemExit:
  192.                 pass
  193.         except:
  194.                 traceback.print_exc()
  195.                 pygame.quit()
  196.                 input()
复制代码
最佳答案
2017-7-13 15:13:33
没有安装pygame,没法调试查看。
但是根据你的描述,大致看了一下代码,delay这个地方好像有的小疑问。
首先给了一个初始值
66:
  1. delay=60#延迟参数
复制代码

然后每10s发射子弹
115:
  1.                 #子弹装载
  2.                 if not (delay % 10):   #每10帧发射一枚子弹
  3.                         bullet_sound.play()
  4.                         bullet1[bullet1_index].reset(me.rect.midtop)
  5.                         bullet1_index=(bullet1_index + 1) % 6
复制代码

这里是通过下面的代码进行对delay值的改变
187:
  1.                 #显示我方飞机
  2.                 if delay==0:
  3.                         delay=60
  4.                 else:
  5.                         delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
复制代码

这里有种情况,如果delay== 0,由上到下,先进行了115行的装载子弹,然后才进行187行的delay值改变,而改变的值为60,则下一次循环115行还是在装载子弹。
但这里是第6发和第7发(下一次第一发)一起发生,和你描述不同(我这么没法调试,你再看看。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-13 15:13:33 | 显示全部楼层    本楼为最佳答案   
没有安装pygame,没法调试查看。
但是根据你的描述,大致看了一下代码,delay这个地方好像有的小疑问。
首先给了一个初始值
66:
  1. delay=60#延迟参数
复制代码

然后每10s发射子弹
115:
  1.                 #子弹装载
  2.                 if not (delay % 10):   #每10帧发射一枚子弹
  3.                         bullet_sound.play()
  4.                         bullet1[bullet1_index].reset(me.rect.midtop)
  5.                         bullet1_index=(bullet1_index + 1) % 6
复制代码

这里是通过下面的代码进行对delay值的改变
187:
  1.                 #显示我方飞机
  2.                 if delay==0:
  3.                         delay=60
  4.                 else:
  5.                         delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
复制代码

这里有种情况,如果delay== 0,由上到下,先进行了115行的装载子弹,然后才进行187行的delay值改变,而改变的值为60,则下一次循环115行还是在装载子弹。
但这里是第6发和第7发(下一次第一发)一起发生,和你描述不同(我这么没法调试,你再看看。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-13 15:42:17 | 显示全部楼层
json 发表于 2017-7-13 15:13
没有安装pygame,没法调试查看。
但是根据你的描述,大致看了一下代码,delay这个地方好像有的小疑问。
...
  1.                 #显示我方飞机
  2.                 if delay==0:
  3.                         delay=60
  4.                 delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
复制代码


我把这一段改成了这样,我不应该加这个else的,不然delay=0,delay=60确实会出现两连发的情况。感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 04:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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