pygame实现 飞机大战-第二版功能改进

按照个人的相法,对原代码进行了改进,添加功能如下:

功能1:飞机的移动多样化

原代码飞机只能左右移动,没有前后移动,增加飞机前后移动

方法:

1、在GameSprite初始化时添加一个速度值参数,用于水平速度的设定

class GameSprite(pygame.sprite.Sprite):
    def __init__(self, image_name, speed1=1,speed2=1):
        #继承父类方法
        super().__init__()

        self.image = pygame.image.load(image_name) #通过图像生成surface对象
        self.rect = self.image.get_rect() #生成rect对象
        self.speed1 = speed1 #设置垂直速度,如果不设置则默认为1
        self.speed2 = speed2#设置水平速度,如果不设置则默认为1,主要是飞机应用

2、在Hero的定义中,初始化中添加参数调用,加上修改update,添加y方向的运动,并且添加底部防出框的代码

class Hero(GameSprite):
    def __init__(self):
       .......

    def update(self):
        # 英雄在水平方向运行
        self.rect.x += self.speed2
        # 英雄在垂直方向运行
        self.rect.y -= self.speed1
        # 控制英雄不能离开屏幕
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.y < 0:
            self.rect.y = 0
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right
        elif self.rect.bottom> SCREEN_RECT.bottom:
            self.rect.bottom = SCREEN_RECT.bottom

3、在plane_Main中胡__event_handler中添加键值上下对水平速度参数的控制

keys_pressed = pygame.key.get_pressed()
        # 判断元祖中对应的按键索引值
        if keys_pressed[pygame.K_RIGHT]:
            # print("向右移动。。。")
            self.hero.speed2 = 2
        elif keys_pressed[pygame.K_LEFT]:
            self.hero.speed2 = -2
        else:
            self.hero.speed2 = 0

        if keys_pressed[pygame.K_UP]:
            
            self.hero.speed1 = 2
        elif keys_pressed[pygame.K_DOWN]:
            self.hero.speed1 = -2
        else:
            self.hero.speed1 = 0

功能2:实现计分功能

实现过程在不停的摸索后实现,反正就是变量的作用域问题,自己走了不少弯路,一言难尽啊!不说了,直接说明:

1、在碰撞处返回每次的碰撞数,添加参数返回

  def __check_collide(self):
        # 1.子弹摧毁敌机
        shooted=pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)
       
            # print("碰撞的个数:{0}".format(len(shooted)))

        return len(shooted)

2、在方法调用处接收每次的碰撞数,也就是击落飞机的架数

 num_shooted=self.__check_collide()
            Score += num_shooted *100

3、在开始定义Score,并赋原始值0,然后在使用处即2的位置上加global 将其变为全局变量,并计算得到Scorer的值

global Score

4、创建标签,并显示

 #创建标签和精灵组
        Label_score =LabelSprite("得分:" + str(Score), 0, 0, 30)
        label_group=pygame.sprite.Group()
        label_group.add(Label_score)
#创建LabelSprite精灵
class LabelSprite(pygame.sprite.Sprite):
    def __init__(self,content,x,y,fontsize=30):
        super().__init__()
        # self.destination = destination
        self.content = content
        self.myfont = pygame.font.SysFont("font/Marker Felt.ttf", 40)
        print("self.content内容是{0}".format(self.content))
        self.textImage = self.myfont.render(self.content, True, (0,0,0))
        self.rect = self.textImage.get_rect()
        self.rect.x = x
        self.rect.y = y

功能3:实现音效与背景音乐

1、创建SoundSprite精灵

创建SoundSprite精灵,定义播放方法,而参数决定是音效还是音乐

#创建SoundSprite精灵
class SoundSprite(pygame.sprite.Sprite):
    def  __init__(self,sound_name):
        super().__init__()
        self.sound_name=sound_name

    def play(self,is_music=False):
        self.sound = pygame.mixer.Sound(self.sound_name)
        pygame.mixer.Sound.play(self.sound)
        if is_music :
            self.music=pygame.mixer.music.load(self.sound_name)
            pygame.mixer.music.play(-1)

2、初始化声音

# 初始化声音
pygame.mixer.init()

3、调用音效及音乐

#  播放背景乐

music=SoundSprite("sound/game_music.mp3")
music.play(True)
#添加子弹发出的声音
        sound_bullet=SoundSprite("sound/bullet.mp3")
        sound_bullet.play()
sound_enemydown=SoundSprite("sound/enemy0_down.mp3")
        if len(shooted) > 0:
            sound_enemydown.play()

说明:

一开始直接加入声音,会产生很多的声音,十分杂乱,因此加入判断,返回值有内容时才能播放声音,才正常。

 
 

猜你喜欢

转载自blog.csdn.net/sygoodman/article/details/124400418