暨南大学C++课程作业——尼尔 E 结局复刻 金牌收录

项目简介

这是一个复刻了《尼尔:机械纪元》E 结局的小游戏。项目从像素级开始构造游戏,没有使用游戏引擎,没有使用额外的素材,很多视觉和运动特效都是通过一些纯粹的数学物理方法 + 代码制作出来的。

编译环境:VS2022 + EasyX_20220901

游戏操作

菜单操作

  • W 和 S 键:上下选择菜单项(实际上只有一个菜单项是有效的)
  • Enter:确认选项

E 结局操作

  • WSAD 键:控制小飞机的移动
  • 鼠标:通过鼠标的实际位置与小飞机位置的连线,确定小飞机的射击方向
  • P 键:暂停游戏
  • F3 键:显示游戏目前的状态

游戏执行效果

游戏视频:https://www.bilibili.com/video/BV1CT411g7A4

场景截图:

Cover

Game

部分特效的实现算法简介:

  • 开始界面的那个一闪一闪的带有光晕的粒子:

  1. 光晕效果:用一个中心权值大,周围权值小的一个卷积核把原始的亮度渐变圆卷积出来;
  2. 光晕半径与亮度的周期性变化:利用三角函数计算得来;
  3. 闪烁效果:在三角函数的波峰附近添加随机函数实现。
  • E 结局中敌人的随机轨迹:
  1. 随机轨迹的外驱力:等时间间隔地在一定范围内生成随机点,利用 PID 算法中的"P",即根据上一时刻的位置与新生成的位置之间的距离,等比例地设置回调力;
  2. 随机轨迹的平滑:利用动量保持的思想,在利用回调力来更新其速度时,将保留一部分的历史速度。
  • E 结局中红色粒子特效的轨迹:
  1. 轨迹的驱动力:根据万有引力,在某几个位置设置引力源,这些引力源来共同为粒子提供驱动力;
  2. 粒子群的初速度设置:通过差异化的初速度设置,使得粒子被引力源所捕获,或逃逸,从而形成不同轨迹(抛物线,双曲线,椭圆),能让整个粒子群的轨迹效果看起来飘逸一点。
  • E 结局中小飞机的旋转:

  1. 小飞机旋转角度的确定:通过鼠标与小飞机之间的连线与水平的夹角,确定小飞机当前相对于水平线的旋转角;
  2. 小飞机的旋转的实现:在绘制小飞机的各个部件的顶点时,使用的都是相对于小飞机中心点的相对坐标,在需要旋转时,利用线性代数中的旋转矩阵,将其与这些相对坐标相乘,即可实现旋转。

还有很多很多的地方用到了其它的数学或物理方法,就不一一赘述了。

源代码下载

完整项目地址:https://github.com/YNG2020/Nier-Automata-Ending-E

后记

当时在 C++ 课程作业上,我们组原本选了一个现成的俄罗斯方块的游戏,打算做一个带有尼尔剧情的扩展,但是做完之后觉得还有很多时间去做更好的东西,于是花了两个月的时间把 E 结局复刻出来了。本人主要负责开始菜单,E 结局中小飞机的绘制,红色粒子和敌机的轨迹以及一些杂项;另外一个室友主要负责后面的 E 结局(各种特效粒子的视觉效果,玩家与敌机的各种判定等),开始菜单中荧光粒子特效的光影平滑。

评论 (4) -

  • 你们太牛了 不过作为一名玩东方project的STG玩家表示弹幕难度还能再难点吗
  • 可以考虑使用 SDF 实现“开始界面的那个一闪一闪的带有光晕的粒子”

添加评论