暨南大学C++课程作业——尼尔 E 结局复刻
2023-7-29 ~ 2023-7-30
(4)
项目简介
这是一个复刻了《尼尔:机械纪元》E 结局的小游戏。项目从像素级开始构造游戏,没有使用游戏引擎,没有使用额外的素材,很多视觉和运动特效都是通过一些纯粹的数学物理方法 + 代码制作出来的。
编译环境:VS2022 + EasyX_20220901
游戏操作
菜单操作
- W 和 S 键:上下选择菜单项(实际上只有一个菜单项是有效的)
- Enter:确认选项
E 结局操作
- WSAD 键:控制小飞机的移动
- 鼠标:通过鼠标的实际位置与小飞机位置的连线,确定小飞机的射击方向
- P 键:暂停游戏
- F3 键:显示游戏目前的状态
游戏执行效果
游戏视频:https://www.bilibili.com/video/BV1CT411g7A4
场景截图:
部分特效的实现算法简介:
-
开始界面的那个一闪一闪的带有光晕的粒子:
- 光晕效果:用一个中心权值大,周围权值小的一个卷积核把原始的亮度渐变圆卷积出来;
- 光晕半径与亮度的周期性变化:利用三角函数计算得来;
- 闪烁效果:在三角函数的波峰附近添加随机函数实现。
- E 结局中敌人的随机轨迹:
- 随机轨迹的外驱力:等时间间隔地在一定范围内生成随机点,利用 PID 算法中的"P",即根据上一时刻的位置与新生成的位置之间的距离,等比例地设置回调力;
- 随机轨迹的平滑:利用动量保持的思想,在利用回调力来更新其速度时,将保留一部分的历史速度。
- E 结局中红色粒子特效的轨迹:
- 轨迹的驱动力:根据万有引力,在某几个位置设置引力源,这些引力源来共同为粒子提供驱动力;
- 粒子群的初速度设置:通过差异化的初速度设置,使得粒子被引力源所捕获,或逃逸,从而形成不同轨迹(抛物线,双曲线,椭圆),能让整个粒子群的轨迹效果看起来飘逸一点。
-
E 结局中小飞机的旋转:
- 小飞机旋转角度的确定:通过鼠标与小飞机之间的连线与水平的夹角,确定小飞机当前相对于水平线的旋转角;
- 小飞机的旋转的实现:在绘制小飞机的各个部件的顶点时,使用的都是相对于小飞机中心点的相对坐标,在需要旋转时,利用线性代数中的旋转矩阵,将其与这些相对坐标相乘,即可实现旋转。
还有很多很多的地方用到了其它的数学或物理方法,就不一一赘述了。
源代码下载
完整项目地址:https://github.com/YNG2020/Nier-Automata-Ending-E
后记
当时在 C++ 课程作业上,我们组原本选了一个现成的俄罗斯方块的游戏,打算做一个带有尼尔剧情的扩展,但是做完之后觉得还有很多时间去做更好的东西,于是花了两个月的时间把 E 结局复刻出来了。本人主要负责开始菜单,E 结局中小飞机的绘制,红色粒子和敌机的轨迹以及一些杂项;另外一个室友主要负责后面的 E 结局(各种特效粒子的视觉效果,玩家与敌机的各种判定等),开始菜单中荧光粒子特效的光影平滑。