自機が弾を撃つ(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ずつ増えていきます。 このプログラムでは、まず合計を入れる変数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
この処理は、「ステージスタート時の初期設定」部分に追加します。