一、前言
Python是目前相当流行的一门编程语言,网上有人用Python做了一个《飞机大作战》的小游戏,并且出了一份视频教程,很有意思。“基于Python的飞机大作战小游戏“的视频教程、素材及源码详见:https://www.bilibili.com/video/BV1bq4y1Q7TY/
“飞机大作战小游戏”这个小游戏用其他编程语言也可以完成,不同的编程语言都有自己的特色。我用LabVIEW也编写了这个“飞机大作战小游戏”,功能和界面和Python的一模一样。本文将介绍制作这个小游戏的过程。大家在用LabVIEW做完这个小游戏后,可以跟Python的小游戏对比一下,就会发现LabVIEW作为图像化编程语言非常好用,跟Python比起来也毫不逊色!
二、功能介绍
1、主界面,按任意键开始游戏
图1 主界面
2、左右键移动飞机;
3、空格键发射子弹;发射子弹有音效;
4、石块碰到飞机:血条减少(石块越大,减血越多)、有爆炸效果、有音效;
5、血条到0,命减1条,一局游戏3条命;3条命用完,游戏结束;
6、子弹打到石块:分数增加(石块越大,加分越多)、有爆炸效果、有音效;
7、石块随机出现,石块掉落,分数减少(尽量打爆所有出现的石块);
图2 游戏界面1
8、子弹打爆石块有一定概率掉落礼品:强化(飞机攻击力增强)、血包(用于回血)
9、飞机碰到“强化”后,发射子弹有单发变为双发;双发N次后,强化效果消失;飞机碰到石块后,强化效果消失;
10、飞机碰到“血包”后,血条增加;
图3 游戏界面2
11、游戏结束后,会显示得分,按Escape键退回到初始界面
图4 结束界面
三、编程思路
Python调用了pygame模块,用于完成“飞机大作战小游戏”小游戏的制作。LabVIEW没有专门的游戏工具包,所以我们直接编写,不借助外力,也很简单!
课外小知识
Python非常火的一个非常重要的原因之一就是它有非常丰富的、成熟高效的资源库(官方模块+第三方模块),Python只是完成调用,开发效率大大提高。因为Python非常火,所以第三方模块也非常多、非常完善。像刚才提到的pygame模块就是第三方模块。
我们回到LabVIEW,LabVIEW非常好用的一个非常重要的原因之一也是它有非常丰富的、成熟高效的资源库(官方模块+第三方模块)。LabVIEW是为了工业领域设计的,使用群体主要是工业设计人员及高校师生,所以用户群体不大(相对于互联网群体),所以LabVIEW的资源库主要是以官方模块为主,第三方模块相对来说比较少。好在NI公司(LabVIEW的设计公司)比较给力,推出的官方模块相当丰富,也非常好用。
前面说了,LabVIEW是为了工业领域设计的,像游戏类模块,LabVIEW目前还没有,但是LabVIEW是一门图像化编程语言,上手及编程速度非常快,我们这儿直接用LabVIEW编写这个小游戏,没有借助第三方模块。即使在这样的情况下,跟Python比也毫不逊色!
3.1 飞机、石块、子弹、血包、强化是怎么做出来的?
答:用自定义控件制作的。把bool控件制作成自定义控件。飞机、石块、子弹、血包、强化只是替换的图片的不同,本质都是bool控件。
图5 自定义控件
3.2 爆炸及碰撞效果是怎么做出来的?
答:给二维图片控件连续赋值爆炸效果图片,形成爆炸效果
图6 爆炸及碰撞效果实现方式
3.3 音效是怎么做出来的?
答:LabVIEW是支持标准wav格式音频播放的。如果你的音频是非wav格式、 LabVIEW无法播放wav格式,可以用“格式工厂”软件转换一下。
图7 音频播放程序框图
3.4 飞机、石块、子弹是怎么移动的?
答:通过给控件的“位置属性”赋值不同的数值,控件在前面的位置就会产生变化。
图8 通过位置属性控制飞机移动
图9 通过位置属性控制飞机移动
3.5 如何检测按键输入?
答:LabVIEW本身有专门的函数可以实现键盘输入采集。
图10 按键采集函数
图11 按键采集程序框图
3.6 如何检测碰撞?
答:
(1)首先通过控件的位置属性获取控件的位置,然后通过控件的边界属性获取控件的长度和宽度。
图12 控件边界属性
图13 控件位置属性和边界属性
图14 控件位置和边界
(2)然后计算两个控件(比方说:子弹、石块;飞机、石块)之间的位置。一般采用两种方法:
方法1:石块和飞机等效为圆,通过控件位置坐标、宽度、高度三个信息可以计算出控件等效圆的圆心坐标、和圆半径。
图15 控件等效为圆
若两个控件的圆心距离小于两个控件的半径之和,则认为产生碰撞!
图16 石块碰撞飞机示意图
若两个控件的圆心距离大于等于两个控件的半径之和,则认为没有产生碰撞!
图17 非碰撞示意图
方法2:石块和子弹等效为方形,通过控件位置坐标、宽度、高度三个信息,就可以知道控件上下左右的位置。
图18 控件等效为方形
如果:子弹位于石块的左右范围内 并且 (子弹的顶部位于石块上下范围内 或 子弹的中部位于石块上下范围内 或 子弹的尾部位于石块上下范围内),则认为产生碰撞!
图19 子弹打到石头示意图
3.7 不同界面如何切换
答:此游戏共有3个界面。都比较简单,这儿没有用界面跳转,而是采用了一个小技巧。这三个界面是叠在一起的,界面3位于最底层,界面1与2位于上层;界面3始终处于可见状态;需要界面1显示的时候,界面2隐藏;需要界面2显示的时候,界面1隐藏;需要界面3显示的时候,界面1、2隐藏。
图20 游戏界面
那么界面是怎么实现隐藏和显示的呢? 界面1、2有二维图片控件、按钮、字符串控件组成,这些控件都可以通过控件的属性节点设置为可见或隐藏。
图21 二维图片控件
图22 通过控件的可见属性控制控件显示与隐藏
图23 通过控件的可见属性控制控件显示与隐藏
四、编程技巧
4.1 多个类似控件操作
游戏中要同时操作(主要是移动)多个子弹或者石块,最直接的方法是挨个操作控件的属性节点。
图24 移动控件
需要操作的控件比较多(子弹16个、石块8个),这样操作非常耗费时间,也容易误操作或漏操作。这儿介绍一种比较简单的操作方法。
图25 子弹和石头控件
遍历前面板所有的控件,只要是控件的标签文本前两个字为“石头”,就认为是石头控件(这儿要注意,非石头控件命名的时候,前两个字不要包含石头),然后统一对石头控件操作接可以了。
图26 控件批量移动
同理子弹控件也是同样的操作。
4.2 提高执行速度
因为程序中需要对30多个控件位置进行判断、移动,有些地方需要特殊处理,提高执行速度,不然整个游戏运行会很慢,影响游戏体验!程序里使用了两种方法提高执行速度,游戏界面100ms刷新一次,游戏体验还可以。
方法1:尽量实用局部变量,减少使用属性节点的方式调用控件的值。属性节点执行速度比较慢。
方法2:不要实时刷新前面板,可以定时刷新。
图27 界面停止刷新代码
图28 界面启动刷新代码
五、实现讲解
整个程序总体上分为8部分:
图29 游戏的整体程序界面
下面就这8部分做一个简单介绍:
1、 系统初始化
2、 主程序1
循环实现以下功能(100ms一个循环):
(1) 石块下降、子弹上升、礼品下降
(2) 出界判断
(3) 碰撞检
图30 主程序1
3、 点击按钮弹广告
通过调用DOS命令行打开网页。
图31 点击按钮弹广告
图32 点击按钮弹广告程序
4、 主程序2
按键检测,主要有三项功能:
(1) 通过左右键控制飞机移动
(2) 通过空格键控制子弹发射
(3) 控制界面切换
图33 界面切换示意图
5、 游戏初始化
6、 爆炸效果
7、 碰撞效果
8、 音频播放
5、6、7、8的程序实现方式都是一样的。5、6、7、8有主程序控制执行,且只执行一次。如需再次执行需要主程序再次进行控制。
下面以声音播放为例给大家讲解一下:
主程序需要音频播放的时候,置“声音控制”为True,声音播放程序进行声音播放,播放完毕后,“声音控制”置为False,音乐只播放一遍。如果需要再次播放,主程序需要再一次置“声音控制”为True。
图34 声音播放程序框图
六、视频教程及源码
http://blog.eeecontrol.com/FJZZ/