飞机大战
准备工作
首先,我们再开始编写程序之前,要明确程序结构,对应关系,合理的准备分析,能使我们的开发工作事半功倍
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)
该类用于为其他类提供基本的继承,包括单个图片对象,血量和绘