mPython有趣的飞机大战

来源 :电脑报 | 被引量 : 0次 | 上传用户:sophieyeah
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  飞机大战是一款经典的射击游戏,操作简单,玩法多样,玩家只需要控制自己的飞机左右飞行,躲避或瞄准随机出现的敌机,并发射子弹击落敌机,即可获得游戏积分。在去年《电脑报》的一篇文章中,小陈老师在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 发射子弹

  通过编写以上的代码,我们已经可以实现飞机大战的基本功能了。但是游戏还可以更加完善,還可以给游戏增加积分系统、生成多架敌机、加入连续发射子弹等等,当然编程难度会上升,如果你觉得不错,和小陈老师一起动手完成飞机大战吧。
其他文献
在信息交互的时代,很多人将工作生活全部转移到了线上,通过WiFi就能完成一切沟通。但这样的方式适合所有人吗?很明显答案是否定的。在很多情况下,重要资料需要进行加密存储,线上传递的安全系数反而更低。如果选择实体存储设备就能够巧妙且安全地解决这个困扰,也不用担心数据丢失。另外,移动存储设备选择多样化,可以满足不同工作环境的使用。移动机械硬盘容价比高,冷数据备份最合适  可能细心的用户已经发现,以前说移
期刊
随着Intel第12代酷睿处理器上市,DDR5内存也出现在了玩家们的视线中。DDR5内存作为次世代平台的内存解决方案,带来了更高的频率和诸多全新特性,将带来更加优秀的性能表现。目前各大存储厂商都推出了自家旗下的DDR5内存解决方案,下面我们就一起来看看来自美商海盗船的旗舰级DDR5内存美商海盗船铂金统治者RGB 5200 16×2套装的表现吧。更高频率更大带宽的DDR5和DDR4有何区别  从物理
期刊
早在2020年7月,JEDEC固态技术协会就正式发布了新的主流内存标准DDR5 SDRAM的最终规范,2020年10月7日,全球第一款DDR5内存就正式发布了,是面向服务器、数据中心的RDIMM形态。但是,面向消费级平台使用的DDR5内存仍是犹抱琵琶半遮面。直到今年,存储厂商陆续发布旗下消费级DDR5内存。在11月4日Intel第12代酷睿处理器正式性能解禁之后,消费级DDR5内存的真正性能也随之
期刊
快充+长续航保证刚需  每年双十一,手机厂商开展促销活动,还会推出一些价格亲民,入手门槛更低的产品,例如我手中的荣耀Play5 活力版。  手机是当代人使用频率最高的电子产品,所以充电速度和续航的重要性不言而喻,1500-2000元价位作为面向广泛消费群体的产品,快充和大电池更应该成为标配。荣耀Play5 活力版刚好具备这两点。  它内置4300mAh电池,支持66W快充,这套组合会出现在这款手机
期刊
如果不是宣布退出的消息传来,可能很多人已经完全忘记了雅虎——这个曾经高调进入中国的互联网门户网站开创者。  近日,雅虎公司表示,从11月1日起,雅虎的全部服务将不再向中国大陆地区提供。其实早在2013年,中国雅虎邮箱、资讯和社区等服务就已经宣告停止服务。  这样的结局并不让人意外,正如曾栖身雅虎的周鸿祎所言,很多跨国互联网公司初入中国,都面临一个选择市场还是选择血统的问题,“当巨头来到中国市场,往
期刊
这段时间,很多人每天不是在取快递,就是在去取快递的路上。由于活动规则的变化,“双十一”现在已经不再单指11月11日这个时间点,而是成为了自11月1日开始的一场购物狂欢。现在这个时候,大家的“扫货”工作已经进入了收尾阶段。  既然该买的也买完了,跟之前的Desk Tour分享一样,我们来分享一下小编们在双十一期间购买了哪些数码产品。主播小喻:主力机换成了iPhone 13  之前我的主力机是小米11
期刊
在计算机编程中,“线程”(thread)指的是一组可以在程序中独立执行的指令集合,它是代码执行的最小单位。如果程序在运行过程中只有一个线程的话,那么下一个任务必须要等到上一个任务结束后才能进行,这是一种低效的“串行”流程;引入“多线程”运行机制后,就可以在主线程执行任务的同时“并行”执行其他的任务,几乎不需要等待时间,从而极大提高程序的运行效率。值得一提的是,“多线程”与程序调用函数并不相同,因为
期刊
新势力为何青睐商场“档口”  传统的汽车市场就像一个封闭花园,新能源汽车打开了围墙。  截至2021年6月,特斯拉共有98家体验店地92家特斯拉中心地14家服务中心、12家交付中心地10家获授权的钣喷中心,其中,99%的体验店位于商超地段。  11月1日,蔚来汽车透露,10月已经新建20家“蔚来空间”,全国服务网点数量已经达到312家。它们无一例外全部位于各大城市商业综合体,例如融创茂、来福士、万
期刊
在上期文章里,我们完成了对手指标记的跟踪,并将10级细分的线段与跟踪目标进行钩挂,再结合布料系统,实现了跟随手指运动的动态贴纸效果,但目前仍处于雏形阶段,要真正实现如视频教程片头那样的效果,还得继续完善设计。第一步:利用几何节点完成贴纸形态  上期我们虽然做到了贴纸跟随的效果,但那只是一条线段,你在渲染时依然什么都看不到,所以还需要将线段具象化,你可能会想:我只需要把它转成曲线,再在曲线属性里设置
期刊
近期,中青宝抢足了眼球。  凭借研发中的元宇宙游戏《酿酒大师》,中青宝从2021年9月6日至11月8日,涨幅超400%,从而被资本市场津津乐道。  为此,深交所两度下发关注函。  最近的一次,要求公司说明《酿酒大师》计划研发投入的测算依据、是否充足、是否具有合理性,是否与构建元宇宙方面相关游戏的目标相匹配;要求公司进一步核实公司股价短期内涨幅较大与公司基本面是否匹配,并就股价较大波动进行充分的风险
期刊