|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我一共设置了6发子弹,可是第一和第二发子弹居然会一起发射,求dalao帮忙看看
以下是我的代码- bullet1=[]
- bullet1_index=0 #子弹索引
- for i in range(6): #定义了6个普通子弹
- bullet1.append(bullet.Bullet1(me.rect.midtop)) #子弹的初始位置为我方飞机头部正中央
复制代码
然后是加载子弹
- #子弹装载
- if not (delay % 10): #每10帧发射一枚子弹
- bullet_sound.play()
- bullet1[bullet1_index].reset(me.rect.midtop)
- bullet1_index=(bullet1_index + 1) % 6
- for each in bullet1:
- if not each.hit:
- each.move()
- screen.blit(each.image,each.rect)
- bullet_hit=pygame.sprite.spritecollide(each,enemies,False,pygame.sprite.collide_mask)
- if bullet_hit:
- each.hit=True
- for i in bullet_hit:
- i.active = False
复制代码
我的普通子弹类如下- import pygame
- class Bullet1(pygame.sprite.Sprite):
- def __init__(self,position):
- pygame.sprite.Sprite.__init__(self)
- self.image=pygame.image.load('image/bullet1.png').convert_alpha()
- self.rect=self.image.get_rect()
- self.speed=[0,-12]
- self.rect = self.rect.move(self.speed)
- self.rect.left,self.rect.top=position #将小子弹位置和大飞机绑定
- self.hit=False #定义子弹是否打中
- self.mask=pygame.mask.from_surface(self.image)
- def move(self):
- self.rect = self.rect.move(self.speed)
- if self.rect.bottom ==0:
- self.hit=True
- def reset(self,position):
- self.hit=False
- self.rect.left,self.rect.top=position
复制代码
主程序代码如下- import sys
- import pygame
- import traceback
- import myplan
- import enemy
- import bullet
- from pygame.locals import *
- from random import *
- #初始化以及加载背景
- pygame.init()
- pygame.mixer.init()
- clock=pygame.time.Clock()
- bg_size=width,height = 400,650
- screen=pygame.display.set_mode(bg_size)#创建一个宽600,高四百的窗口
- pygame.display.set_caption("飞机大战") #设置标题
- background=pygame.image.load('image\\background.png') #加载背景图片
- #载入游戏音乐
- pygame.mixer.music.load("sound/game_music.wav")
- pygame.mixer.music.set_volume(0.2)
- bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
- bullet_sound.set_volume(0.2)
- big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav")
- big_enemy_flying_sound.set_volume(0.1)
- enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
- enemy1_down_sound.set_volume(0.2)
- enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
- enemy2_down_sound.set_volume(0.2)
- enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
- enemy3_down_sound.set_volume(0.2)
- me_down_sound = pygame.mixer.Sound("sound/game_over.wav")
- me_down_sound.set_volume(0.2)
- button_down_sound = pygame.mixer.Sound("sound/button.wav")
- button_down_sound.set_volume(0.2)
- level_up_sound = pygame.mixer.Sound("sound/achievement.wav")
- level_up_sound.set_volume(0.2)
- bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
- bomb_sound.set_volume(0.2)
- get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
- get_bomb_sound.set_volume(0.2)
- get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav")
- get_bullet_sound.set_volume(0.2)
- #向组中添加大中小飞机函数
- def add_small_enemies(group1,group2,num):
- for i in range(num):
- small_enemie=enemy.SmallEnemy(bg_size)
- group1.add(small_enemie)
- group2.add(small_enemie)
- def add_mid_enemies(group1,group2,num):
- for i in range(num):
- mid_enemie=enemy.MidEnemy(bg_size)
- group1.add(mid_enemie)
- group2.add(mid_enemie)
- def add_big_enemies(group1,group2,num):
- for i in range(num):
- big_enemie=enemy.BigEnemy(bg_size)
- group1.add(big_enemie)
- group2.add(big_enemie)
- def main():
- switch_image=False #控制我放飞机两张图片切换的标志位
- delay=60#延迟参数
- pygame.mixer.music.play(-1)
- clock=pygame.time.Clock()
- runnning=True
- me=myplan.MyPlan(bg_size)#生成自己的飞机
- enemies = pygame.sprite.Group()#敌方飞机总组
- small_enemies=pygame.sprite.Group()#生成小飞机组
- add_small_enemies(small_enemies,enemies,15)
- mid_enemies=pygame.sprite.Group()#生成中飞机组
- add_mid_enemies(mid_enemies,enemies,4)
- big_enemies=pygame.sprite.Group()#生成大飞机组
- add_big_enemies(big_enemies,enemies,2)
- bullet1=[]
- bullet1_index=0 #子弹索引
- for i in range(6): #定义了6个普通子弹
- bullet1.append(bullet.Bullet1(me.rect.midtop)) #子弹的初始位置为我方飞机头部正中央
- #飞机坠毁图像列表索引
- small_destroy_index = 0
- mid_destroy_index = 0
- big_destroy_index = 0
- me_destroy_index = 0
- while runnning:
- for event in pygame.event.get():
- if event.type == QUIT:
- pygame.quit()
- sys.exit()
- key_pressed = pygame.key.get_pressed() #通过键盘接受指令,使小飞机上下左右移动
- if key_pressed[K_UP]:
- me.speed=[0,-10]
- me.move()
- if key_pressed[K_DOWN]:
- me.speed=[0,10]
- me.move()
- if key_pressed[K_LEFT]:
- me.speed=[-10,0]
- me.move()
- if key_pressed[K_RIGHT]:
- me.speed=[10,0]
- me.move()
- screen.blit(background,(0,0)) #背景填充
- #子弹装载
- if not (delay % 10): #每10帧发射一枚子弹
- bullet_sound.play()
- bullet1[bullet1_index].reset(me.rect.midtop)
- bullet1_index=(bullet1_index + 1) % 6
- for each in bullet1:
- if not each.hit:
- each.move()
- screen.blit(each.image,each.rect)
- bullet_hit=pygame.sprite.spritecollide(each,enemies,False,pygame.sprite.collide_mask)
- if bullet_hit:
- each.hit=True
- for i in bullet_hit:
- i.active = False
- #在屏幕上显示大型飞机
- for each in big_enemies:
- if each.active:
- each.move()
- if switch_image:#切换打飞机的图片,造成动态效果
- screen.blit(each.image1,each.rect)
- else:
- screen.blit(each.image2,each.rect)
- if each.rect.bottom == -50: #当大飞机即将出现在屏幕上的时候,加载出场音乐
- big_enemy_flying_sound.play(-1) #循环播放
- else:
- #坠毁
- if not (delay % 3):#每三帧切换一次图片
- if big_destroy_index==0:
- enemy3_down_sound.play() #保证每个飞机坠毁只播放一次音效,否则每切换一张坠毁图片就要播放一次
- screen.blit(each.destroy_images[big_destroy_index],each.rect)
- big_destroy_index = (big_destroy_index+1) % 6 #索引值到6后重新变为1
- if big_destroy_index==0:
- big_enemy_flying_sound.stop()
- each.reset()#当坠毁系列图片播放完毕,重置飞机位置
- #在屏幕上显示中型飞机
- for each in mid_enemies:
- if each.active:
- each.move()
- screen.blit(each.image,each.rect)
- else:
- if not (delay % 3):#每三帧切换一次图片
- if mid_destroy_index==0:
- enemy2_down_sound.play()
- screen.blit(each.destroy_images[mid_destroy_index],each.rect)
- mid_destroy_index = (mid_destroy_index+1) % 4 #索引值到6后重新变为1
- if mid_destroy_index==0:
- each.reset()#当坠毁系列图片播放完毕,重置飞机位置
- #在屏幕上显示小型飞机
- for each in small_enemies:
- if each.active:
- each.move()
- screen.blit(each.image,each.rect)
- else:
- if not (delay % 3):#每三帧切换一次图片
- if small_destroy_index==0:
- enemy1_down_sound.play()
- screen.blit(each.destroy_images[small_destroy_index],each.rect)
- small_destroy_index = (small_destroy_index+1) % 4 #索引值到6后重新变为1
- if small_destroy_index==0:
- each.reset()#当坠毁系列图片播放完毕,重置飞机位置
- #碰撞检测 检测飞机是否坠毁
- enemies_down=pygame.sprite.spritecollide(me,enemies,False,pygame.sprite.collide_mask)
- if enemies_down:
- me.active=False #如果发生了碰撞,我方飞机状态设置为坠毁
- for each in enemies_down:
- each.active=False #敌方碰撞的精灵全部设置为坠毁
- #显示我方飞机
- if delay==0:
- delay=60
- else:
- delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
- if not delay % 3:
- switch_image=not switch_image #每三帧切换一次飞机图片,造成喷气效果
- if me.active:
- if switch_image:
- screen.blit(me.image1,me.rect)
- else:
- screen.blit(me.image2,me.rect)
- else:
- me_down_sound.play()
- if not (delay % 3):#每三帧切换一次图片
- screen.blit(me.destroy_images[me_destroy_index],me.rect)
- me_destroy_index = (me_destroy_index+1) % 4 #索引值到6后重新变为1
- if me_destroy_index==0:
- me.reset()#当坠毁系列图片播放完毕,重置飞机位置
-
- pygame.display.flip()#更新界面
- clock.tick(60)#帧数为60
- if __name__=='__main__':
- try:
- main()
- except SystemExit:
- pass
- except:
- traceback.print_exc()
- pygame.quit()
- input()
复制代码
没有安装pygame,没法调试查看。
但是根据你的描述,大致看了一下代码,delay这个地方好像有的小疑问。
首先给了一个初始值
66:
然后每10s发射子弹
115:
- #子弹装载
- if not (delay % 10): #每10帧发射一枚子弹
- bullet_sound.play()
- bullet1[bullet1_index].reset(me.rect.midtop)
- bullet1_index=(bullet1_index + 1) % 6
复制代码
这里是通过下面的代码进行对delay值的改变
187:
- #显示我方飞机
- if delay==0:
- delay=60
- else:
- delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
复制代码
这里有种情况,如果delay== 0,由上到下,先进行了115行的装载子弹,然后才进行187行的delay值改变,而改变的值为60,则下一次循环115行还是在装载子弹。
但这里是第6发和第7发(下一次第一发)一起发生,和你描述不同(我这么没法调试,你再看看。)
|
|