弾幕生成のごく簡単な実装方法は、「弾幕を構成するパラメタ群を列挙して、そいつらを乱数で散らしていい弾幕ができるのを祈る」なのだが、それを突き詰めると「任意の場所から任意の方向に任意のスピードの任意の数の弾を任意のタイミングで撃っていい感じになることを祈る」という完全ランダム弾幕になってしまうので、やはりどういったパラメタをベースに弾幕を生成するのかをある程度は考えないといかん。
今使っている手法では、基本的に円形に複数の砲台(弾源)を配置するとして、
- 円の半径
- 楕円の離心率
- 中央の砲台を配置する円周上の角度
- 砲台の数
- 砲台間の間隔の角度
この辺までが基本的な砲台の配置に関連するパラメタで、
- 弾の発射方向
- 弾の発射スピード
- 弾の発射時間間隔
これが砲台から発射される弾に関連するパラメタ。もちろんこれらのパラメタが持つ値は、固定の値だけではなくて、半径、配置角度、間隔角度、発射方向、発射スピードは、
- 固定値
- 単調変化
- 三角波
- 正弦波
のどれかに沿った時間的変移をする。
あと、複数砲台間の味付けとして、各砲台における発射相対速度も固定値、単調変化、三角波に沿って変化させたり、砲台の発射タイミングをずらして中央から外側に徐々に撃ち始めるようにしたりする。
あとは各砲台から撃つ弾をさらに加工する。
- 単発
- N-way
- 棒状弾
- (ムチ状の)加速弾
- 扇状弾
- 1→N-way弾(三角形状弾)
こんくらいのパラメタを乱数で適当に設定してやると、まあたまにそれっぽいものができる。あとはこれら砲台群を複数配置して、左右反転して、とかやってさらに組み合わせる。
これらのパラメタを使うアプローチが、完全に適当に撃つ方式と比べて何が優れているかというと……よくわからん。そもそも良い弾幕とは何かの定義がないからなあ。おそらくはプレイヤーが次の弾を予測可能であるためによけやすいこと、とかそういったことがあるのだろうが……弾幕のエントロピー、コルモゴロフ複雑性みたいのがあるのかなあ。出来上がった形状を人間がどう認知するかの問題だからそういったのとはまた別の話かな。