埴安神袿姫の方形造形術を再現してみた


はじめに

この記事は,東方鬼形獣6面ボス埴安神袿姫の方形造形術を再現するための解説をするものである.

なお,解説には三角比を用いるため,閲覧にあたってはそれに関する知識を持っていることが望ましい.ただし,本記事の最後に弾幕を再現するスクリプトの例も示してあるので「よくわからないけど遊んでみる」ということも可能である.

再現する弾幕

今回再現するのは,下記画像のように「全方位に向かって方形に弾を撃つ弾幕」である.以下ではこの弾幕を「方形弾幕」と呼ぶ.

解説

ある1点から全方位に向かって同じ速さで弾を発射すると,単位時間あたりに進む弾の距離はすべて等しいから,弾幕は円形になる.これを方形にするためには,発射角に応じて弾の速さを変える必要がある.なぜなら,円はどの角度でも中心からの距離が等しい図形であるが,方形は違うからである1

従って,やることは角度に応じた速さを求めることであるが,速さは「単位時間あたりに進む距離」のことだから,結局上図でいうところの橙色の線の長さを考えればよい.

直角三角形OABに注目すると,三角比の定義から

\cos\theta=\frac{\mathrm{OB}}{\mathrm{OA}}
\Leftrightarrow
\mathrm{OA}=\frac{\mathrm{OB}}{\cos\theta}

であることがわかる.このことを利用して弾の速さを設定してやればよい.

スクリプト

上記での議論をベースにして実際に東方弾幕風v0.12mで方形弾幕を再現する関数を作成した一例を示しておく.

// x: 発射場所のx座標
// y: 発射場所のy座標
// speed: 最も遅い弾の発射速度
// angle: 方形のある1辺の中点に来る弾の発射角
// grf: 弾画像
// delay: 遅延時間
// way: 45°あたりの弾の数
function Square(x,y,speed,angle,grf,delay,way) {
    let gap = 45/way;
    loop(4) {
        ascent(i in 0..way) {
            CreateShot01(x,y,speed*1/cos(gap*i),angle+gap*i,grf,delay);
        }

        angle += 45;

        ascent(i in 0..way) {
            CreateShot01(x,y,speed*1/cos(45-gap*i),angle+gap*i,grf,delay);
        }

        angle += 45;
    }
}

次の図は上記のスクリプトでやっていることのイメージ図である.下図では矢印の向きが反時計回りになっているが,東方弾幕風では「角度の正の向き=時計回り」になっていることは留意しておいたほうがよい.

その他

  • 鬼形獣は良い曲ばっかり.

  1. 方形の「中心」としては対角線の交点を考えればよい.