首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mPython有趣的飞机大战

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

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

硬件版的飞机大战我们需要在掌控板的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)……

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

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

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

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

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

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

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

在游戏中,通过触摸掌控板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

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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20211110A081PV00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券