第7回 あっち? そっち? どっち?

今回は、条件によって処理を分岐させてみようと思います。

要旨

それではいってみましょう。

数フレーム毎に実行

今までで少し弾幕らしくなってきましたが、まだ重要な問題が存在しています。まだ毎フレーム必ず弾が発射されるという問題です。これを何とかするには、数フレーム毎に弾を発射するようにしなくてはなりません。これを実現するためには、あるフレームでは弾を発射せず、別のフレームでは弾を発射する、といったことを行う必要があります。これは今までの知識だけでは実現できない処理です。なぜなら、発射角のようなものは変えられても、「処理を行うかどうか」というところまでは変えられないからです。

このように、「処理を行うかどうか」や「条件によって処理を変更する」といったことは、弾幕を作る上でよくある処理です。このような処理の事を条件分岐と言います。名前の通り、条件によって分岐するわけです。

では、この条件分岐を使って弾の発射間隔を変更するにはどうすれば良いでしょうか? 簡単には、次の様な処理が考えられます。

  1. フレーム数をカウントする変数を用意します。
  2. 毎フレーム毎に変数の値を 1 だけ増やします。
  3. そのフレーム数がある数に達した時のみ弾を発射し、さらに変数の値を 0 に戻します。

それでは、実際にやってみましょう。

#東方弾幕風
#Title[テストスクリプト]
#Text[テストスクリプト]
#ScriptVersion[2]

script_enemy_main {
    let imgBoss = "script\img\ExRumia.png";
    let angle   = 90;
    let frame   =  0;

    @Initialize {
        SetX(GetCenterX);
        SetY(GetClipMinY + 120);
        SetLife(2000);

        LoadGraphic(imgBoss);
        SetTexture(imgBoss);
        SetGraphicRect(0, 0, 63, 63);
    }

    @MainLoop {
        SetCollisionA(GetX, GetY, 24);
        SetCollisionB(GetX, GetY, 24);

        frame++;
        if(frame == 5) {
            CreateShot01(GetX, GetY, 1, angle, WHITE01, 0);
            angle += 2;
            frame = 0;
        }
    }

    @DrawLoop {
        DrawGraphic(GetX, GetY);
    }

    @Finalize {
        DeleteGraphic(imgBoss);
    }
}

強調した部分が追加した部分です。また、発射間隔が広がるので、発射角の増分は 2 に変更しておきました。

注目すべき所は 2 つです。先ずは frame をフレーム毎に 1 つずつ増加させる部分です。

frame++;

前回までの知識を使えば、ここは

frame += 1;

とするところです。これら2つの処理は両方とも同じように動作しますが、1 増やすということはよく行われるため、特別な ++ という演算子が用意されているのです。当然ながら、1 減らす場合は -- を使います。

そして、今回追加した部分で最も重要な部分は次の箇所です。

if(frame == 5) { ... }

これが件の条件分岐です。条件分岐を行うには、if というものを使います。if の次の ( ) の中に条件を書くと、条件が満たされている場合のみ { } の中の処理が実行されます

今回の場合はどうでしょうか。条件は

frame == 5

です。これは frame の値が 5 かどうかを判定する条件式になります。数学的には = を使いたい所ですが、東方弾幕風においては = は代入で使われる演算子だと話しました。そのため、等しいかどうかを判定するには = ではなく == を使います

以上をまとめると、{ } の中の処理が 5 フレーム毎に呼ばれる事になります。つまり、5 フレーム毎に弾が発射されるわけです。

条件分岐の文法

条件分岐の文法を詳しく書くと次のようになります。

if(<条件式>) {
    <条件式が真の時に実行される処理>
} [else {
    <条件式が偽の時に実行される処理>
}]

条件式が正しいことをと、間違っていることをと言います。これは普通の数学用語ですが、プログラムでもよく使われます。上の例では条件が真の時のみ処理をしましたが、場合によっては偽の時にも特別な処理をしたい場合があります。そのような時には else を続けます。

else の中でさらに条件分岐を行いたい場合は、

if(<条件式1>) {
    <条件式1が真の時に実行される処理>
} else if(<条件式2>) {
    <条件式1が偽で、条件式2が真の時に実行される処理>
} else {
    <条件式1も2も偽の時に実行される処理>
}

のように書く事もできます。

要旨

次回は、似たような処理を何度も実行してみたいと思います。

第6回 | 第8回 | 目次へ戻る

この講座はロベールが作成しました。
inserted by FC2 system