今回は、条件によって処理を分岐させてみようと思います。
if
と else
を使えば条件によって処理を変更できます。==
を使います。それではいってみましょう。
今までで少し弾幕らしくなってきましたが、まだ重要な問題が存在しています。まだ毎フレーム必ず弾が発射されるという問題です。これを何とかするには、数フレーム毎に弾を発射するようにしなくてはなりません。これを実現するためには、あるフレームでは弾を発射せず、別のフレームでは弾を発射する、といったことを行う必要があります。これは今までの知識だけでは実現できない処理です。なぜなら、発射角のようなものは変えられても、「処理を行うかどうか」というところまでは変えられないからです。
このように、「処理を行うかどうか」や「条件によって処理を変更する」といったことは、弾幕を作る上でよくある処理です。このような処理の事を条件分岐と言います。名前の通り、条件によって分岐するわけです。
では、この条件分岐を使って弾の発射間隔を変更するにはどうすれば良いでしょうか? 簡単には、次の様な処理が考えられます。
それでは、実際にやってみましょう。
#東方弾幕風 #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( ) { } else if( ) { } else { }
のように書く事もできます。
if
と else
を使えば条件によって処理を変更できます。==
を使います。次回は、似たような処理を何度も実行してみたいと思います。