基于Python的飞机大战游戏开发
2020-05-14陆嘉诚王楚虹师文庆
陆嘉诚,王楚虹,师文庆,黄 江
(广东海洋大学电子与信息工程学院,广东湛江 524088)
0 引言
从20世纪70年代开始,电子游戏以一种商业娱乐媒体被引入,成为日本、美国和欧洲一个重要娱乐工业的基础[1]。1994年游戏商业开始在中国大陆崭露头角,虽然中国游戏工业起步相比美国日本等国家起步晚了20多年,可是经过近年来的发展,至2014年,中国电子游戏产业产值179亿美元,仅次于美国(205亿美元)[1]。
时至今日,游戏已经植根在日常生活中,随着移动设备的普及,休闲类的游戏大大符合了人们碎片化时间管理的概念,无论是上下班、车上消磨时间还是在排队等候,都能看到游戏娱乐的身影。由此发掘到游戏背后的商业模式,以及开发游戏程序设计的可行性。为此,本文提出了基于Python语言开发的飞机大战类小游戏的二次开发。根据游戏的运行流程以及游戏元素的嵌入,将开发分成了4个模块:子弹类、敌军飞机类、自身飞机类、奖励类。
1 游戏开发总体方案设计
1.1 游戏开发资源
目前互联网发展迅速,随之发展了各种强大的编程语言和实时电子游戏研发模块,比如Pygame模块,为开发游戏程序提供了技术基础。由于Python的开源性和语言的流行,使得Python语言日趋成熟,在游戏的编程中提供强大的资源结构[2-5]。
按照游戏工业市场的飞机游戏开发需求,分析游戏的基本功能,在此基础上增加游戏的各类功能模块完善游戏。本设计所用到的编程语言是Python,版本是Python3.6,开发工具为Pycharm,根据现有资源,调用Pygame包,对游戏进行开发、运行及测试。游戏程序编辑、编译、调试、发布所有过程都是基于PC机平台运行。
1.2 游戏开发总体方案
游戏实现的功能如下:上下左右的方位移动,游戏奖励补给的添加和获取,敌机的增添,难度等级的变化,血量的增添,炸弹奖励的增加,重生时的无敌计时和超级子弹时间的定时,游戏得分的记录和最高记录的保持。软件程序为本设计的最核心的部分,每一个代码块都构成了设计的整体,因此,先由每个小功能入手,分别实现该设计的程序功能,然后封装,调用,在程序的主体中调用封装好的代码块,从而运行整个程序的整体。软件开发结构如图1所示,程序上为面向对象编程,大体上可分成子弹类,敌机类、自身飞机类、奖励类4大类,再在主程序中继承实例化以及嵌套。
图1 飞机大战开发结构图
2 游戏程序详细设计
2.1 程序主函数
程序main函数主要进行定义和继承的相关操作,实现成员函数的定义和成员属性的定义,继承相关函数并添加相关的游戏特性,譬如分数的递增功能的实现[6-9]。游戏运行整体流程图如图2所示。游戏运行中判断优先级别,层层嵌套功能模块,循环检测各项功能和监听游戏的相关事件,譬如监听游戏superbullet事件和投放时间的设定等等,最后运行整体程序。
图2 程序设计流程图
2.2 子弹功能模块
子弹实例化中,分成了两种射击模式,一个是普通子弹(buttle),另一个是超级子弹(superbullet),包括了外形、速度、与敌机碰撞的撞击等基本因素,其基本属性方法如图3所示。在设计时需要进行子弹图片的载入,子弹的发射速度设置、跟随飞机飞行时的发射位置以及打印发射轨迹等。由于图片的载入,飞机大战的子弹仍然需要越界判定以及弹药回收的问题,这样以此形成循环以实现游戏资源的最大化,从而实现游戏的开发优化。在图中定义了它们的移动方法,图片的初始化载入,回收标志等等。具体设计中,开设一个空列表superbullet=[]来定义子弹实例化个数,将超级子弹功能模块的效果设计为3行弹道同时射出,所以需要获取子弹发射的位置,总体子弹个数为12个,但是因为是同时射出,所以在for循环条件中添加具体的循环条件(superbullet_NUM//3)使得子弹分4次发射把生成的子弹装入列表superbullet后,只需要遍历列表就可以将子弹实例,同时以同样的位置参数去回收子弹,列表中的子弹也是与敌机的碰撞检测对象。
图3 子弹的属性和方法
2.3 敌军飞机功能模块
敌军飞机的飞行模式设定为单一向垂直移动飞行模式,设计飞行的速度,调用随机函数,设定敌军飞机的随机高度和随机宽度,在设置高度的时候,为避免敌军飞机生成时出现的突兀感以及飞机生成的完整性,所以在初始化的时候传入宽高大小,让敌军飞机的高度生成在框架以外,宽度生成在框架宽度之间。
敌军飞机实例成大中小3类飞机,其中大、中两类飞机赋予血量属性。其基本的属性和方法如图4所示,将敌军飞机分成small、mid、big三大类,载入模型的宽高信息,定义速度、生成数量等属性。其中当敌机碰撞检测后,血量减1。设计敌机生成函数将敌机生成到两个精灵组里面,其中一组enemies负责所有敌军飞机碰撞检测,另一组用来判断类型敌机碰撞后血量的减小,并通过draw-line函数绘制出血条属性。其中,绘制血条需要获取敌军位置参数,以及通过检测血量扣取值反馈比例来实现血条的递减视觉效果。
图4 敌军飞机的属性和方法
2.4 自身飞机模块
自身飞机的功能属性如图5所示,需要自身飞机的图片加载、飞行速度设置、飞行上下移动等功能。由于上下左右移动的属性是类同的,所以直接套用函数模板,但是值得注意的是,在设计飞行边界的时候,需留意之前对Pygame框架大小的设定值,调整参数大小避免飞机模型的穿框情况。自身飞机类要涉及到跟敌机的碰撞问题,并以此为判断条件结束游戏。增加游戏的视觉效果,在设计模型以及模型的绘画制作中,绘制自身飞机毁坏的模型,建立一个精灵组,将自身飞机毁坏模型加载到精灵序列图里面等待加载,并通过条件判断加载调用。
图5 自身飞机类属性和方法
2.5 奖励模块
游戏的奖励模块是本设计实现游戏创新的重要组成部分,本文中设计了生命、超级子弹、炸弹3个功能属性的奖励。生命奖励是在判断生命没有溢出的情况下,在与自身飞机碰撞检测判断后实现生命的增长;超级子弹奖励是实现子弹的限时输入升级,在bullet类中交互,实现superbullet的游戏功能;炸弹奖励是在索引键盘的相对按键键入后,实现炸弹功能,回收所有的游戏元素(除本身飞机和子弹外)。具体实现的流程如图6所示,奖励事件的监听需要在游戏的运行过程中,所以奖励的投放需要血量的判断,在满足血量属性的判断条件下,执行事件的监听,对奖励进行投放,而碰撞的相关形式采用非透明区域图像碰撞检测,如果碰撞检测为真,则回收子弹和飞机,若敌军飞机是非小型敌机类,则根据相关血量的原设定值递减。
图6 奖励实现流程图
3 游戏运行结果
图7 游戏界面与运行效果
运行设计流程操作如下:按照得分生成对应数量敌机→ 定时生成奖励事件→对子弹类实例化→自身飞机实例化→敌机子弹碰撞检测和游戏得分→我军飞机敌机碰撞检测和游戏结束。游戏的整体运行结果如图7所示,图7(a)开始界面中,打印游戏的开始等待界面,并说明具体的操作方式,并等待ENTER键键入开始游戏,其实质就是事件的监听判断,图7(b)可以看到游戏实现的功能模块包括有:得分、难度等级、奖励补给机制的触发,小型敌机的生成,图7(c) 实现了超级子弹的输出功能,也实现了大型敌机生成及其碰撞掉血检测,还有难度等级提升检测,加载了各种游戏功能,从中可以看到游戏的bullet功能、award功能、enemy功能以及myplan功能都可以实现完成,而且游戏的细节优化如计分,画面滚动的功能等也都运行成功,图7(d)可以看到游戏的得分记录显示成功以及记录最高记录保存成功。
总体来看游戏模块功能各项运行成功,能实现飞行类游戏的基本功能:上下左右的方位移动,游戏奖励补给的添加和获取,敌机的增添,难度等级的变化,血量的增添,炸弹奖励的增加,重生时的无敌计时和超级子弹时间的定时,游戏得分的记录和最高记录的保持。
4 结束语
本文设计的基于Python的飞机大战小游戏,完成了游戏的基本行动模块,包括游戏的敌机、自身飞机、子弹等,同时拓展功能模块有等级提升、超级子弹奖励、英雄生命奖励等,实现了一款可玩性较高的功能较多的飞机大战类型游戏。