设为首页收藏labplus社区产品资料库
151
积分值+2
64
掌控币+1
0  关注
79  粉丝
54  帖子
luyi
2020年11月20日

#基础使用#王牌飞行员申请出战 ——掌控飞机大战

王牌飞行员申请出战

——掌控飞机大战

       飞机大战是一款经典的飞行射击游戏,操作简单,玩法多样,久玩不腻。玩家只需要控制自己的飞机左右飞行,躲避或瞄准随机出现的敌机,并发射子弹击落敌机,即可获得游戏积分。

        视频演示

一、绘制游戏对象

       如下图1所示,飞机大战游戏只有己方飞机、敌机和子弹这三类游戏对象。而每个游戏对象都有自己的外观和位置(坐标)。本游戏中的对象并非使用导入图片的方法制作,而是直接在掌控板OLED显示屏(128x64px)上绘制像素点而成的。


       为了更好地绘制游戏对象的外观,需要先在Excel电子表格中绘制好草图,一个单元格表示一个像素点。(好吧,我喜欢用Excel绘图,简单便捷)

       1. 绘制己方飞机

       如下图所示2所示是己方飞机绘制的草图。假设飞机最上方顶点为坐标参考原点(xPlane,yPlane),则我们可以轻松的使用xPlane和yPlane这两个变量表示出飞机的其他点坐标。


      己方飞机的绘制关系详细如下:

      第1行绘制点(xPlane,yPlane)

      第2行绘制直线(xPlane-1,yPlane+1)到(xPlane+1,yPlane+1);

      第3行绘制直线(xPlane-1,yPlane+2)到(xPlane+1,yPlane+2);

      第4行绘制直线(xPlane-2,yPlane+3)到(xPlane+2,yPlane+3);

      第5行绘制直线(xPlane-3,yPlane+4)到(xPlane+3,yPlane+4);

      第6行绘制直线(xPlane-4,yPlane+5)到(xPlane+4,yPlane+5);

      第7行绘制直线(xPlane-6,yPlane+6)到(xPlane+6,yPlane+6);

      第8行绘制直线(xPlane-6,yPlane+7)到(xPlane+6,yPlane+7);

      第9行绘制直线(xPlane-6,yPlane+8)到(xPlane+6,yPlane+8);

      第10、11行绘制矩形原点为(xPlane-5,yPlane+9)长2宽3像素;

      第10、11行绘制矩形原点为(xPlane-1,yPlane+9)长3宽3像素;

      第10、11行绘制矩形原点为(xPlane-4,yPlane+9)长2宽3像素;

       另外,为了使游戏更加生动逼真,我们给己方飞机添加尾部“喷火”效果。即交替显示第10、11行,出现一闪一闪的“喷火”效果。其图形代码如下图3所示。


       2. 绘制敌机

       敌机的形状和大小和玩家己方飞机是不一样的。首先,它头部朝下。因此,敌机的原点坐标应该设置在下方(xEnemy,yEnemy)。如下图4所示是敌方飞机绘制草图。


      敌方飞机的绘制关系详细如下:

      第1行绘制点(xEnemy,yEnemy)

      第2行绘制直线(xEnemy-1,yEnemy-1)到(xEnemy+1,yEnemy-1);

      第3行绘制直线(xEnemy-2,yEnemy-2)到(xEnemy+2,yEnemy-2);

      第4行绘制直线(xEnemy-3,yEnemy-3)到(xEnemy+3,yEnemy-3);

      第5行绘制直线(xEnemy-5,yEnemy-4)到(xEnemy+5,yEnemy-4);

      第6、7行绘制矩形原点为(xEnemy-4,yEnemy+6)长2宽2像素;

      第6、7行绘制直线(xEnemy,yEnemy-6)到(xEnemy,yEnemy-5);

      第6、7行绘制矩形原点为(xEnemy-3,yEnemy+6)长2宽2像素;

      其图形代码如下图5所示。


       3. 绘制子弹

       本游戏中绘制的子弹比较简单,只有两个点。设置第一个描点的坐标为(xBullet,yBullet),则第二个点的坐标为(xBullet,yBullet+1)。其图形化代码如下图6所示。


      注意:子弹的有“显示”和“不显示”两种状态。绘制时需要做出一点的判断。

二、游戏事件触发与过程实现

       1. 己方飞机的左右移动控制

       定义函数planeMove(),调用全局变量xPlane和yPlane,如果玩家触摸掌控板P键,将飞机的横坐标减去4个像素。如果玩家触摸掌控板N键,则将飞机的横坐标加上4个像素。另外,为了防止飞机飞出OLED显示屏的显示范围,其横坐标的范围是 10 <= xPlane <= 118。

       己方飞机的图形化代码如下图7所示。


       2. 随机生成敌方飞机

        定义一个变量enemyState表示敌机的生存状态,当其为真值时,表示存活,可以显示出来;当其为假值时,表示死亡,不显示。另外,敌机是从掌控板OLED显示屏上方随机出现的。因此,在选取xEnemy的横坐标时,需要取6-110之间的随机数。想一想,为什么不是0-127呢?

敌机的飞机头是原点坐标(xEnemy,yEnemy),方向向下。因此纵坐标范围可以是0-7,本游戏选用敌机的初始纵坐标为7。

       随机生成敌方飞机的图形化代码如下图8所示。


       3. 敌方飞机自上而下运动

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

       敌方飞机自上而下运动的图形化代码如下图9所示。


       4. 己方飞机发射子弹

       在游戏中,可以触摸掌控板T键控制己方飞机发射子弹射击敌方飞机。子弹的位置坐标是(xBullet,yBullet)。由于子弹每次从己方飞机的炮口发射,因此,子弹的初始坐标:

             xBullet = xPlane

             yBullet = yPlane

       子弹的存活状态bulletState为真值时,表示子弹存活,显示出来。同样地,bulletState为假值时,表示子弹死亡,隐藏起来。

       由于子弹的运动轨迹和速度与其他对象亦不相同,我们还是使用多线程来实现它。定义多线程1,当玩家触摸T键,并且当前没有子弹在飞行时(本游戏每次限定只能发送1枚子弹),调用该多线程1。子弹产生后,每隔100毫秒向上运动4个像素,即yBullet增加-4。如果子弹击中敌机或者子弹到达掌控板OLED显示屏上方时销毁,存活状态设置为假。如果子弹在发射过程中没有击中敌机,则重新回到炮口中。

        己方飞机发射子弹图形化代码如下图10所示。


       5. 判断子弹击中敌机

       游戏中判断子弹击中敌机非常简单,只要子弹进入敌机内部,即可判断为一次击中事件。如下图11所示,为子弹击中敌机图解。


       为降低游戏难度,把不规则的敌机看作是一个矩形,矩形左边界横坐标为xEnemy-5,右边界横坐标为xEnemy+5,头部纵坐标为yEnemy,则击中敌机的条件是:


       6. 敌方飞机爆炸效果制作

       当子弹击中敌机后,子弹和敌机死亡,不显示。同时,以敌机的位置(坐标)为原点,横坐标从xEnemy-10到xEnemy-10,纵坐标从yEnemy-10到yEnemy-10的范围随机50个点,来模拟爆炸效果。如下图12所示,是制作敌机爆炸效果图形化代码。


       三、结语

       游戏写到这里,已经基本完成了飞机大战的游戏,并且可以嗨起来了。但是,这个游戏并未完善,比如己方飞机撞击敌方飞机的事件未曾实现,游戏中积分系统尚未写入,以及如何同时生成多架敌机、可以连续发射多颗子弹等等功能需要去思考。如果你有更多关于游戏的想法,欢迎下方留言讨论。

文件名:plane.zip

2

点赞

1599 次阅读3 条评论2 人赞1 人订阅
3条评论