关于弹幕游戏弹幕算法的探讨

STG算法讨论

初识弹幕游戏, 和我入宅几乎是同时. 东方Project在我人生中绝对占据了不是很小的位置(这句话好奇怪). 做一个弹幕游戏, 这是我一直很想干的. 而现在, 我也在开发学习一个弹幕游戏引擎– NiaDanmakuEngine.
弹幕游戏最重要的就是弹幕, 一个弹幕游戏的好坏, 很大程度上决定在弹幕生成和设计的精妙程度. 而支撑弹幕生成和设计的, 则是弹幕的算法. 弹幕和其他Sprite不同, 需要相对复杂的运动轨迹, 以及经常性德大量渲染, 这就带给了弹幕算法两个根本性的问题:

  1. 弹幕运动算法
  2. 渲染算法
    (这一段感觉也好怪)

总而言之, 我尝试了两种方法, 外加我想过的一个, 总共是三个.

1. 函数描述方法

利用多段复杂函数来描述子弹运动, 无法达到合格的效率, 不是最好的解决方案. 同时也很难描述复杂的运动, 也给引擎加载弹幕带来了困难, 函数的动态添加和保存修改我还是没想到很好的方案.
况且这个方法还是反自然的…

2. 参数方程描述方法

这个是我后来想到的, 更加反自然而且运算量更大.
虽然不少人这样做, 可惜我low…

3. 运动角度增量描述方法

给定初始速度和位置, 利用增量来描述运动. 这便是我现在使用的方法. 定义一个BalletDescriber的结构体, 便可以描述一段运动.

1
2
3
4
5
6
typedef struct {
Vector Speed;
Vector SpeedInc;
float RotationInc;
int FramesDelay;
}BalletDescriber;

而通过该段运动持续的帧数则可以描述多段运动.
而且这个是最自然的!
妖精们发射弹幕都是通过魔法来改变弹幕的受力, 不会有妖精发射个弹幕还得吭哧吭哧画个坐标系, 求解个函数. 或者用参数方程. 最起码小⑨不会!

总结:

尊重自然才会得到最好的解决方案, 小⑨是不会原谅用参数方程描述弹幕的愚蠢的人类的呀~~

新年快乐~