tmlib.jsとbulletml.jsを使って弾幕STGを作る(3)

# 弾幕基本パターン7種

今回はよく使われる基本的な弾幕パターンを紹介します。

[ソースコードはこちら](https://github.com/daishihmr/bulletml.js-tutorial/archive/part3.zip)

## 自機狙い

自機の位置を狙ってくる弾です。弾幕パターンの基本中の基本と言えるでしょう。

大量に出現するザコ敵は、この攻撃を行うのが一般的です。

発射方向を微妙にずらして撃つ場合もあります。
特に、プレイヤーが回避する移動先に撃つなどすると面白いでしょう。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(999, [
            fire(speed(2.1), bullet()),
            wait("$rand * 20"),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample1-aim.html

(参考) http://youtu.be/JMDeO6424Yw?t=28s

## 固定方向弾

自機狙いに対し、自機の位置に依存しない攻撃です。
単発ではあまり意味をなしませんが、規則的にたくさんの固定方向弾を配置することで、障害物として機能させることも出来ます。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(999, [
            fire(direction(180, "absolute"), speed(2.1), bullet()),
            wait("$rand * 20"),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample2-fix.html

(参考) http://youtu.be/JMDeO6424Yw?t=11m8s

## n-way

一度に複数の方向へ等間隔に発射する攻撃です。
発射弾数によって5way、7wayなどと呼びます。
間隔、発射弾数、発射方向の自機依存／非依存や偶数／奇数などでバリエーションを広げていきます。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(999, [
            fire(direction(-30), speed(1.5), bullet()),
            repeat(4, [
                fire(direction(15, "sequence"), speed(0, "sequence"), bullet()),
            ]),
            wait(120),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample3-n-way.html

(参考) http://youtu.be/JMDeO6424Yw?t=1m13s

## 全方位

n-wayの派生型で、全周に向けて一斉に発射する攻撃です。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(999, [
            fire(speed(1.5), bullet()),
            repeat(35, [
                fire(direction(10, "sequence"), speed(0, "sequence"), bullet()),
            ]),
            wait(120),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample4-all-around.html

(参考) http://youtu.be/JMDeO6424Yw?t=1m19s

## 回転砲台

発射方向を変化させながら連続で撃つ攻撃です。
弾が螺旋状になることから、渦巻き弾とも呼ばれます。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(999, [
            fire(speed(1.5), bullet()),
            repeat(100, [
                wait(1),
                fire(direction(21, "sequence"), speed(0, "sequence"), bullet()),
            ]),
            wait(120),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample5-spiral.html

(参考) http://youtu.be/JMDeO6424Yw?t=4m39s

## ウィップ

回転砲台が発射方向を変化させていく攻撃だとするならば、こちらは発射速度を変化させていく攻撃です。
先に撃った遅い弾を、後から撃つ速い弾が追い越して行きます。

プレイヤーにとっては、遅い弾がガイドになってくれるため、単発で発射されたのではとても避けられないような速い弾でも回避できる攻撃となります。

発射間隔や発射方向を変化させることでバリエーションを広げることができます。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(999, [
            fire(speed(1.5), bullet()),
            repeat(10, [
                wait(5),
                fire(direction(0, "sequence"), speed(0.5, "sequence"), bullet()),
            ]),
            wait(120),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample6-whip.html

(参考) http://youtu.be/JMDeO6424Yw?t=3m39s

## ワインダー

間隔の短い高速弾で「弾の壁」を作り、自機の動きを制限することを目的とした攻撃です。
ワインダー自体を徐々に動かす、幅を狭める等で変化をつけることが出来ます。

固定方向弾と同じく単独では意味をなさないため、他の攻撃と組み合わせて使います。

~~~js
var DANMAKU0 = new bulletml.Root({
    top: action([
        repeat(10000, [
            bindVar("d", "Math.sin($loop.index * 0.03) * 20"),
            fire(direction("179 + $d", "absolute"), speed(5.0), bullet(), offsetX(-40)),
            fire(direction("181 + $d", "absolute"), speed(5.0), bullet(), offsetX( 40)),
            wait(5),
        ]),
    ]),
});
~~~

http://daishihmr.github.io/bulletml.js-tutorial/sample8-winder.html

(参考) http://youtu.be/ckJ0D_Q353M?t=24m13s

# まとめ

今回は基本的な弾幕パターンを紹介しました。

実際の弾幕STGを作る際はこれらを単独で、あるいは組み合わせて使っていくことになると思います。

ぜひみなさんも、bulletml.jsを使って激しくも楽しい弾幕を作ってみてください。