鱼C论坛

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

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

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

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

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

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

以下是我的代码
        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()
最佳答案
2017-7-13 15:13:33
没有安装pygame,没法调试查看。
但是根据你的描述,大致看了一下代码,delay这个地方好像有的小疑问。
首先给了一个初始值
66:
delay=60#延迟参数
然后每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发(下一次第一发)一起发生,和你描述不同(我这么没法调试,你再看看。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-13 15:13:33 | 显示全部楼层    本楼为最佳答案   
没有安装pygame,没法调试查看。
但是根据你的描述,大致看了一下代码,delay这个地方好像有的小疑问。
首先给了一个初始值
66:
delay=60#延迟参数
然后每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发(下一次第一发)一起发生,和你描述不同(我这么没法调试,你再看看。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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