Bootstrap

pygame飞机大战详解

飞机大战

准备工作

首先,我们再开始编写程序之前,要明确程序结构,对应关系,合理的准备分析,能使我们的开发工作事半功倍

1、确定我们需要的类

首先,我们做飞机大战,既然需要飞机类(Plane),敌机类(AiPlane),然后是他们两个的基类(Baisc_Plane),用于提供他们重复的属性和方法实现继承。

然后,在这基础之上,我们添加一个子弹类(Bullet),它可以让我们有真正的游戏体验,同样是不可或缺的东西,这三个类,就可以构成我们最基本的飞机大战。

对于后面的流星类,属于优化游戏体验的,后续开发完后,再行添加

2、确立每一个类当中,拥有的属性以及方法

首先先说几个都有的属性和方法

1、self.live 用于判断飞机是否存活

2、self.blood 用于控制飞机血量

3、self.img Actor对象

4、move()移动方法

5、draw()绘制方法

6、oversetup()边界检查

下面列举飞机类作为讨论对象

2.1、飞机类

2.1.1、属性

在属性中,因为要控制飞机移动,所以我们需要上下左右四个标志属性来控制

然后,飞机的得分属性,飞机的子弹列表属性

2.1.2方法

set_direction()方法,控制方向

clear_direction()方法 ,解除方向

飞机大战 主程序

首先需要分析主程序中,需要什么方法?

1、在draw和update中需要的前提变量

因为我们的敌机和子弹、流星对象肯定不可能像玩家一样单独创建控制,所以我们需要一个存放他们对应的列表,并在他们的生命值归零之后,将他们从该列表中移除,这样就不会显示在图像中

2、控制飞机飞行

draw绘制,update更新,除去这两个之外,因为我们的飞机对象需要依靠上下左右的键盘控制移动,所以我们还需要两个方法,一个是获取键盘按下的方法,一个是获取键盘弹起的方法

拥有他们之后,我们的飞机,就可以率先在界面上自由飞行了,实现原理:在这两个方法中调用玩家飞机类对象中的对应方法,根据键盘的反馈获取值,为上下左右赋予布尔值,然后使用布尔值控制飞机移动

def on_key_down(key):
    if login == True:
        plane.set_direction(key)#获取键盘按下的值
​
​
def on_key_up(key):
    if login == True:
        plane.clear_direction(key)#获取键盘弹起的值
​
​

3、绘制所有的图像

首先,分析一下我们需要绘制的图像

1、判断是否登录

首先在我们打开游戏后,应该有个登陆界面,也就是我们应该在其他绘制出来的之前,使用布尔值判断是否登录,未登录则先绘制其他图像,而在我们登陆过后,在绘制出另外的图像,并让整个哟咻运行,因此,update方法同样需要判断是否登录,

2、根据登陆状态播放不同音乐

其次,我们准备了两套背景音乐,一套是未登录时播放,一套时开始游戏播放

3、使用工具类实现我们所有的图像绘画,减少代码冗余,提高观赏性,提高效率

最后,我们需要调用在工具类util当中的实现方法,来绘制剩下的所有图像,因为使用了工具类util,使得我们主程序十分洁简,如果出现问题,可以直接找到对应方法进行修改

def draw():
    global bgmusic_1,bgmusic_2,login
    bg = Actor("../images/背景.png")
    bg.draw()
    #判断登录
    if login==True:
        if bgmusic_1 == True:
            pygame.mixer.music.load("music/backmusic1.mp3")  # 加载MP3文件
            pygame.mixer.music.set_volume(0.8)
            pygame.mixer.music.play(-1)  # 播放mp3文件
            bgmusic_1 = False
        util.show(rank_list,screen,plane,Aiplanes,meteor_list)#工具类util的show方法,所有绘制都在这里实现
        plane.show_score()#plane类的绘制得分
    else:
        if bgmusic_2 == True:
            pygame.mixer.music.load("music/backmusic2.mp3")  # 加载MP3文件
            pygame.mixer.music.set_volume(0.8)
            pygame.mixer.music.play(-1)  # 播放mp3文件
            bgmusic_2 = False
        login = util.show_login(screen)
​
​

4、update更新数据

在update方法中我们大量使用了封装方法来替代原本的上百行代码

1、判断登陆状态

首先,要先判断是否登录在开始运行其他方法

2、最关键的,也就是对子弹,敌机,流星等更新数据,我们这里使用了util工具类封装,在哪里再详细介绍

def update():
    if login == True:
        '''
            1、循环判断发射出的子弹对象状态是否归零,归零则将子弹对象从子弹数组中删除
             2、控制子弹移动  move方法
            '''
​
        for bullet in plane.bullets:
            bullet.oversetup()#子弹是否超出范围
            if bullet.blood <= 0:
                plane.bullets.remove(bullet)
            bullet.move()
        '''
            1、判断玩家飞机是否存活,存活状态刷新敌机,控制移动,子弹图片变换速度,玩家飞机是否超出边界
        '''
        if (plane.blood > 0):
            util.Create_AiPlane(Aiplanes, plane_kind)#工具类自动创造敌机
            util.Create_Meteor(meteor_list)#工具类自动创造流星
            util.bullet_speed(plane)#工具类自动控制子弹切换图片速度
            plane.oversetup()#玩家飞机类边界检测
            plane.move()
            plane.level_up()#玩家飞机类等级提升
            util.meteor_check(meteor_list,plane)#工具类流星状态检测
            '''
                循环敌机列表,若敌机抵达边界或者碰撞玩家飞机则爆炸以及移除敌机列表,同时控制敌机行动
            '''
            util.AiPlane_check(plane,Aiplanes)#工具类检测敌机状态

飞机大战 类

1基类(basic_plane)

该类用于为其他类提供基本的继承,包括单个图片对象,血量和绘

;