APP下载

基于Python的飞机大战游戏开发

2020-05-14陆嘉诚王楚虹师文庆

机电工程技术 2020年3期
关键词:血量碰撞检测敌机

陆嘉诚,王楚虹,师文庆,黄 江

(广东海洋大学电子与信息工程学院,广东湛江 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的飞机大战小游戏,完成了游戏的基本行动模块,包括游戏的敌机、自身飞机、子弹等,同时拓展功能模块有等级提升、超级子弹奖励、英雄生命奖励等,实现了一款可玩性较高的功能较多的飞机大战类型游戏。

猜你喜欢

血量碰撞检测敌机
LVEF、NT-proBNP联合cTnI对先天性心脏病患儿术后低心排血量综合征的预测价值*
基于动力学补偿的机器人电机力矩误差碰撞检测
冲着敌机,开炮!——M1939式37毫米高射炮
全新预测碰撞检测系统
基于BIM的铁路信号室外设备布置与碰撞检测方法
新中国建国后击落入侵敌机大盘点
膀胱冲洗液中加入去氧肾上腺素在老年患者经尿道前列腺电切术中的应用
BIM技术下的某办公楼项目管线碰撞检测
把天文数字扔进粉碎机
偷架敌机开回家