自機が弾を撃つ(1/2)

 ショットボタンが押されていたら、自機から弾を出します。

 1.自機の弾の配列変数を宣言する
 2.自機の弾の変数に初期値を代入する
 3.自機の弾を射出する
 4.自機の弾を移動する

配列変数

 配列変数とは、複数の要素を持つ変数のことです。例えばaという変数が配列変数である場合、aの0番目、aの1番目、aの2番目……といったたくさんの要素を持ち、それぞれに別の値を代入することができます。
    a.0=12 : a.1=25 : a.2=48 : ……
 これは、HSPでの書き方です。他言語では「a.数字」ではなく「a(数字)」と書くのが一般的です。"."(ピリオド)の右の数字を「添え字」と呼びます。
 要するに、同じ用途の入れ物ではあるが、番号で識別し、入れ物をたくさん用意している、という事です。例えば、自機の弾や敵は画面内に複数存在しますね。その座標も、弾、あるいは敵の数だけ存在します。そういう場合に配列変数を使います。
 この変数は配列変数である、と宣言するには
  dim 変数名,要素数
 と書きます。例えば"dim a,10"と書くと、a.0からa.9までの10個の変数が使えるようになります。変数に代入する値が数値の場合(数値型変数といいます)はdim文です。文字列の場合(文字列型変数といいます)はsdim文で宣言します。

 このように、添え字が1つだけつくものを1次元配列といいます。2つつくものは2次元配列です。
  a.0.0 a.0.1 a.0.2
  a.1.0 a.1.1 a.1.2
  a.2.0 a.2.1 a.2.2
  a.3.0 a.3.1 a.3.2
 要素が上のように2次元状にあります。dim文は、
  dim 変数名,1番目の要素数,2番目の要素数
 のように書きます。上の場合は"dim a,4,3"です。
 3次元以上も同様です。

 1.自機の弾の配列変数を宣言する

 自機の弾は画面上に最大4個まで存在できることにします。自機の弾の座標を配列変数で管理します。あと一つ、4個のそれぞれが存在するか、しないかも配列変数にします。
    dim shotx,4
    dim shoty,4
    dim shotf,4
 shotfはshot flagの略です。存在すれば1を、存在しなければ0を代入することにします。このように、フラグというのは、○○であれば1、○○でなければ0を代入し、何かの状態を識別するものです。代入する値は、1と0というふうに決まっているわけではありません。
 この処理は、「プログラム起動時の初期設定」部分に入れることにします。


repeat文

 同じ処理を、何回か繰り返したい場合があります。
    dim a,4

    a.0=4
    a.1=23
    a.2=51
    a.3=100

    s=0
    repeat 4
        s=s+a.cnt
    loop
    mes "合計は"
    mes s
    mes "です。"
    stop
 これは、a.0からa.3までの値を足し算するプログラムです。repeat〜loopは、その間にある処理を指定回数分だけ繰り返します。repeatの引数が回数です。cntはrepeat文で使うシステム変数で、最初が0で、処理を1回行うたびに1ずつ増えていきます。
  repeat文
 このプログラムでは、まず合計を入れる変数sを0にします。1回目のループで、s=s+a.0が行われます。2回目でs=s+a.1が行われます。同様に4回行いますから、a.0〜a.3がsに足しこまれます。
 ちなみに、mesは引数の内容を画面に書く命令だと前に書きましたが、ddprintとの違いは、DirectXとは関係ないという点です。HSPの標準機能です。ddprintはHMM . DLLで追加されたDirectX用の命令です。

    dim a,4,2

    a.0.0=4 : a.0.1=7
    a.1.0=23 : a.1.1=60
    a.2.0=51 : a.2.1=87
    a.3.0=100 : a.3.1=202

    s=0
    repeat 4
        i=cnt
        t=0
        repeat 2
            t=t+a.i.cnt
        loop
        s=s+t
    loop
    mes "合計は"
    mes s
    mes "です。"
    stop
 これは、a.0.0〜a.3.1の値を足し算するプログラムです。repeat文が2重になっています。このように、repeat文の中にrepeat文がある構造を「入れ子」と言います。(if文の中にif文がある、サブルーチンの中で別のサブルーチンを呼んでいる構造もやはり「入れ子」と言います。)
 内側のrepeat文で、a.i.0とa.i.1の合計tを計算しています。外側のrepeat文で、iを増やしつつ、sにtを足しこんで全体の合計を計算しています。
 この時、内側のループのcntと、外側のループのcntは、名前は同じですが全くの別物です。内側のループでcntの値が変化しても、外側のループのcntに影響しません。例えば、内側のループに入る直前のcntが3だったとします。内側のループでcntは0、1と変化します。ループを抜けた時に、cntは3に戻ります。このプログラムのように、外側のcntの値を内側のrepeat文に渡してやる必要がある場合は、一旦別の変数に移しかえなければなりません。(この場合は、i)

 2.自機の弾の変数に初期値を代入する

 各ステージが始まった時に、自機の弾がまだ1発も存在していない状態にする必要があります。
    repeat 4
        shotf.cnt=0
    loop
 shotf.0〜shotf.3に0を代入します。  また、後述する変数shotcntにも最初に0を代入します。
    shotcnt=0
 この処理は、「ステージスタート時の初期設定」部分に追加します。


[目次へ][前へ][次へ] inserted by FC2 system