APP下载

mPython有趣的飞机大战

2021-11-24陈新龙

电脑报 2021年44期
关键词:横坐标敌机敌方

陈新龙

飞机大战是一款经典的射击游戏,操作简单,玩法多样,玩家只需要控制自己的飞机左右飞行,躲避或瞄准随机出现的敌机,并发射子弹击落敌机,即可获得游戏积分。在去年《电脑报》的一篇文章中,小陈老师在Scratch中编写了一款软件版的飞机大战,只需要通过方向键和空格键便可控制飞机的运动和发射子弹。今天再做飞机大战自然要有所提高,我们通过掌控板结合mPython编程实现硬件版的飞机大战(图1)。

图1 游戏效果

制作游戏的第一步便是绘制游戏对象,包括我方飞机、敌方飞机、子弹三个对象。游戏中每个对象都有特定的外观和位置,以前制作软件版飞机大战时飞机、子弹的图片都是从外部导入图片来使用的。

硬件版的飞机大战我们需要在掌控板的OLED显示屏上显示,由于掌控板OLED显示屏只有126×64的像素点,为了更好地绘制飞机的外观,我们可以先在Excel电子表格中规划好草图,一个单元格代表一个像素点,然后通过掌控板编程显示在屏幕中。例如图2中黄色数字1表示飞机的原点用(xPlane,yPlane)表示,那么第二行就是绘制直线(xPlane-1,yPlane+1)到(xPlane+1,yPlane+1);第三行同样也是绘制直线(xPlane-1,yPlane+2)到(xPlane+1,yPlane+2)……

图2 Excel模拟飞机外观

为了飞机更逼真,我给飞机的尾部添加了“喷火”效果,通过代码方式可以实现一闪一闪的“喷火”效果(图3)。

图3 新建函数plane绘制我方飞机外形

我方飞机绘制完成后将敌方飞机也绘制完成,敌方飞机比我方飞机略小,我方飞机头部朝上,敌方飞机头部朝下。敌机的原点坐标应该设置在下方(xEnemy,yEnemy),第二行绘制直线(xEnemy-1,yEnemy-1)到(xEnemy+1,yEnemy-1),以此类推。飞机的外观可以自行发挥,不必完全拷贝我的设计,定义enemy和plane两个函数作为绘制飞机的外观(图4)。

图4 新建函数enemy绘制敌机外形

游戏中子弹的发射方式和绘制比较简单,子弹的活动范围跟随着我方飞机即可。只需要绘制两个像素点,一上一下。设置第一个点的坐标为(xBullet,yBullet),第二个点的坐标为(xBullet,yBullet+1),其图形化代码如图5所示。

图5 绘制子弹图形

游戏的角色外观都已经绘制完成,接下来可以开始给飞机添加动态效果。以飞机左右移动控制为例,这里我们定义函数planeMove(),通过调用飞机的原点(xPlane,yPlane),当玩家触摸掌控板P键时,飞机向左移动,代表着飞机的横坐标减去4个像素,当玩家触摸掌控板N键时,飞机向右移动,代表着飞机的横坐标加上4个像素。为了防止飞机左右移动超出OLED显示屏,我们需要给飞机设定横坐标的范围(10<=xPlane<=118)(图6)。

图6 飞机的操控左右移动

接下来要考虑如何生成敌方飞机,定义一个变量enemyState表示敌机的生存状态,当其值为真时,表示存活,可以显示;当其值为假时,表示死亡不显示。

那么敌方飞机的运动轨迹是怎么样的呢?答案是自上而下,敌方飞机首次出现时在掌控板屏幕的最上方。敌机从掌控板OLED显示屏上方随机出现,在选取xEnemy的横坐标时,考虑敌机的宽度后取6-110之间的随机数(图7)。

图7 敌机的出现位置

游戏过程中敌方飞机是自上而下从屏幕上方运动到下方的。在运动过程中和我方飞机的运动轨迹不同,速度也可能不同。因此,我们使用多线程来实现。定义线程2,每隔200毫秒将敌机的纵坐标yEnemy增加1个像素,当敌机纵坐标yEnemy大于或者等于64时,视为敌机出界消失,将其存活状态enemyState设置为假,重新生成新的敌机(图8)。

图8 敌机运动轨迹

在游戏中,通过触摸掌控板T键发射子弹射击敌方飞机,子弹的位置是(xBullet,yBullet),由于子弹每次从己方飞机的炮口发射,因此,子弹的初始坐标为:(xBullet = xPlane;yBullet = yPlane)。子弹的存活状态bulletState为真值时,表示子弹发射中,要显示。同样当bulletState为假值时,表示子弹消失,要隐藏起来。由于子弹的运动轨迹和速度与其他对象也不相同,我们还是使用多线程来实现它。

我们设定每次只能发送1枚子弹。定义多线程1,当玩家触摸T键,并且当前没有子弹在飞行时,调用该多线程1。子弹产生后,每隔100毫秒向上运动4个像素,即yBullet增加-4。如果子弹击中敌机或者子弹到达掌控板OLED显示屏上方时自动消失,存活状态设置为假。

那么如何判断子弹是否击中敌机呢?其实非常简单,只要子弹进入敌机内部,便可以判断为击中飞机,由于飞机是不规则的图形,我们可以把敌机当作是一个矩形,矩形左边界横坐标为xEnemy-5,右边界横坐标为xEnemy+5,头部纵坐标为yEnemy,击中敌机的条件是(xBullet>=xBullet-5且xBullet<=xEnemy+5或者yBullet<=yEnemy)。击中目标敌机后,玩家可以根据实际情况增加一个爆炸的效果,增加游戏的趣味性(图9)。

图9 发射子弹

通过编写以上的代码,我们已经可以实现飞机大战的基本功能了。但是游戏还可以更加完善,還可以给游戏增加积分系统、生成多架敌机、加入连续发射子弹等等,当然编程难度会上升,如果你觉得不错,和小陈老师一起动手完成飞机大战吧。

猜你喜欢

横坐标敌机敌方
不可轻用的位似形坐标规律
以一次函数图象为载体的规律探究题
例谈二次函数的顶点横坐标x=-b/2a的简单应用
敌机不可怕 让民工吃饱更重要
“平面直角坐标系”解题秘籍
水果大作战
小罗汉拳技击术(上)
单兵扛导弹
罗汉神打 (下)
罗汉神打(上)