马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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发(下一次第一发)一起发生,和你描述不同(我这么没法调试,你再看看。)
|