★を増やす
変数を増やす
1個だけ出てくる★を避けてても面白くないので、
★の数を増やしましょう。
完成形では徐々に増えていきますが、
とりあえず最初から200個表示させてみましょう。
さて、★の位置は変数star_xとstar_yに入っています。
200個の★はそれぞれ位置がバラバラになりますが、
一つの変数には一つの値しか入れられません。
どうしたらいいでしょうか…
答えは「変数を200個づつ使う」です。
star_xとstar_y、そして、速度もバラバラですから
star_speedをそれぞれ200個ずつ使います。
変数の名前に数値を使ってもいいので、
star_x001、star_x002、star_x003…star_x200という名前にしましょう。
では、まず★の最初の位置を指定してる部分から直していきましょう。
;星の位置
star_x001 = 800
star_x002 = 800
star_x003 = 800
(途中省略)
star_x199 = 800
star_x200 = 800
star_y001 = rnd(480-32)
star_y002 = rnd(480-32)
star_y003 = rnd(480-32)
(途中省略)
star_y199 = rnd(480-32)
star_y200 = rnd(480-32)
;星の速度
star_speed001 = rnd(5) + 2
star_speed002 = rnd(5) + 2
star_speed003 = rnd(5) + 2
(途中省略)
star_speed199 = rnd(5) + 2
star_speed200 = rnd(5) + 2
ウソです。ごめんなさい。こんなのやってられません(^ ^;
真面目に打ち込んじゃった人がいたら本当にごめんなさい。
考え方は正しいんですよ。
変数を大量に扱うのもホントの話。
でも、これだけのために600行も書くのはアホらしいですね。
そこで、HSPを作った人は大量の変数を
楽に扱う方法を用意してくれました。
それを「配列」といいます。
配列
今回のように、同じような変数を複数使いたい場合は次のように書きます。
dim 変数名, 個数
こう書くと、指定した個数の変数がいっきに作られます。
作られた変数名は「変数名(0)」「変数名(1)」「変数名(2)」「変数名(3)」…となります。
つまり、たとえば
dim x, 5
と書いた場合は「x(0)」「x(1)」「x(2)」「x(3)」「x(4)」という
5つの変数が作られます。
(0)~(4)の5個です。x(5)は無いので注意してください。
ちなみに、この()の中に書く番号のことを「添え字」と言います
やってみよう
今回は、star_xとstar_y、star_speedが200個ずつ必要なので、こうなります。
;星の位置
dim star_x, 200
dim star_y, 200
star_x = 800
star_y = rnd(480-32)
;星の速度
dim star_speed, 200
star_speed = rnd(5) + 2
これで変数が200個ずつできました。
次に、star_x(0)~star_x(199)に全部800を代入します。
ここで配列の最大のありがたみがわかります。
配列の添え字(変数名の後ろの番号)は変数で指定することもできます。
つまり、0番から199番まで全部800にするには、こう書けばいいんです。
;星の位置
dim star_x, 200
dim star_y, 200
a = 0
repeat 200
star_x(a) = 800
a = a + 1
loop
star_y = rnd(480-32)
わかりますか?
まず変数aに0を代入しています。
repeat-loopは、その間を指定した回数繰り返すんでしたね?
まず、star_x(a)と書いてありますが、aには0が代入されているので
star_x(0)=800と書いたのと同じです。
次にa+1をaに代入しています。
これでaは1増えて1になります。
これを繰り返すわけですから、次はstar_x(1)=800と書いたのと同じになります。
ということで、star_x(0)~star_x(199)までが全部800になります。
このように、配列はループと併用した時に真価を発揮します。
システム変数
先ほど書いた部分をちょっと修正します。
;星の位置
dim star_x, 200
dim star_y, 200
a = 0 (削除)
repeat 200
star_x(cnt) = 800
a = a + 1 (削除)
loop
変数名をaの代わりにcntに変更しました。
そして、変数に0を代入する部分と、1ずつ増やす部分を削除しました。
なんと、これだけでstar_x(0)~star_x(199)までが全部800になります。
なぜかというと、cntという名前の変数は特別な変数で、
ループが始まるときに勝手に0が代入され、
処理を繰り返すたびに勝手に1ずつ増える変数になります。
cntは「カウンター」の略です。
repeat-loopを使うときはこの変数が
すごく便利なので是非覚えておいてください。
cnt以外にも、勝手に何らかの値が入る変数がいくつかあります。
そういう変数を「システム変数」と呼びます。
他にどんなシステム変数があるについては、
機会があれば別なところで紹介します。
【メモ】
cntが使えるのはrepeat-loopの間だけです。
gotoを使った繰り返しの中では使えません。
他の変数も初期化する
star_xはすべて800になりましたので、ほかの二つの変数も最初の値を代入しましょう。
;星の位置
dim star_x, 200
dim star_y, 200
repeat 200
star_x(a) = 800
star_y(a) = rnd(480-32)
loop
star_y = rnd(480-32) (削除)
;星の速度
dim star_speed, 200
repeat 200
star_speed(cnt) = rnd(5) + 2
loop
こんな感じですね。
全部ループ処理にする
変数の初期化(最初の値を代入すること)はできましたが、
それだけではダメです。
まだ、★の表示も、移動も、1個分の処理しかしていません。
衝突判定もそうですね。
それらの処理を全部ループ処理にします。
具体的にいうと、star_x, star_y, star_speedという変数を
使っている部分はすべて修正しなければなりません。
star_x(0)~star_x(199)という変数を作りましたが
「star_x」という()が付かない変数はもう無い
ということを意識してください。
少しプログラムが複雑になってきたかと思うので、
一度全体を載せておきますね。
;乱数の初期化
randomize
;スクリーンを作成
screen 0, 800, 480
;自機の位置
player_x = 100
player_y = 200
;星の位置
dim star_x, 200
dim star_y, 200
repeat 200
star_x(cnt) = 800
star_y(cnt) = rnd(480-32)
loop
;星の速度
dim star_speed, 200
repeat 200
star_speed(cnt) = rnd(5) + 2
loop
;フォントの設定
font "MS ゴシック", 32
*メインループ
;画面をクリア
color 0, 0, 255
boxf
;自機を表示
color 0, 255, 0
pos player_x, player_y
mes "●"
;自機移動
stick key, 15
if(key & 4){ ;→を押した
player_x = player_x + 5
}
if(key & 1){ ;←を押した
player_x = player_x – 5
}
if(key & 2){ ;↑を押した
player_y = player_y – 5
}
if(key & 8){ ;↓を押した
player_y = player_y + 5
}
;星の移動
repeat 200
star_x(cnt) -= star_speed(cnt)
loop
;星の表示
color 255, 255, 0
repeat 200
pos star_x(cnt), star_y(cnt)
mes "★"
loop
;★が左端に出た
repeat 200
if(star_x(cnt) < -32){
star_x(cnt) = 800 ;ふたたび右端へ
star_y(cnt) = rnd(480-32) ;高さはランダム
star_speed(cnt) = rnd(5) + 2 ;速度もランダム
}
loop
;自機と★の衝突判定
repeat 200
if((star_x(cnt) > player_x – 20) and (star_y(cnt) > player_y – 20) and (star_x(cnt) < player_x + 20) and (star_y(cnt) < player_y + 20)){
end ;プログラム終了
}
loop
await 16
goto *メインループ
これで実行すると、200個の★が一気に出てきて、
どれかにぶつかるとプログラムが終了するはずです。
今回のポイント
- 「dim 変数名, 個数」と書くと、
変数名(0)、変数名(1)、変数名(2)…という複数の変数が作られる。
これを「配列」という。 - 「cnt」という名前の変数は、repeat(ループ開始)のところで0が代入され、loop(ループ終了)のところで自動的に+1される。
ありがとうございました、少しずつ覚えます。