9.弾幕

弾幕を張ります。

弾幕薄いよ!

まず変数を宣言します。弾の情報として弾の座標、弾の速度が必要です。
ddimで実数型配列変数として宣言します。
今回は条件文ifを減らす(動作を軽くする)ために配列変数を二次元にして、
20発の弾をワンセットに処理しています。(わかりにくいかも)

弾を任意の方向に飛ばしたいときは、速度をX方向とY方向に分解します。
下図の緑の線方向に速度Vで弾を飛ばす場合、
vx = V * cos(θ)
vy = V * sin(θ)

速度ベクトルの分解
randomize
screen 0,400,400

//弾の情報を保持する配列
dim tama,20
ddim tx,10,20
ddim ty,10,20
ddim tvx,10,20
ddim tvy,10,20

*main
color 0,0,0 : boxf 0,0,400,400
color 255,0,0 : pos 190,10 : mes "●"

time++
if time \ 20 = 0 :gosub *create_circle_bullet

//弾の処理
color 255,255,255
repeat 10
if tama(cnt) > 0 {
	tama(cnt)++
	if tama(cnt) > 120 :tama(cnt) = 0 //画面から消えて時間が経った弾を消去
	i = cnt
	repeat 20
		tx(i,cnt) += tvx(i,cnt)
		ty(i,cnt) += tvy(i,cnt)
		pset tx(i,cnt),ty(i,cnt)
	loop
}
loop

redraw 1 : wait 3 : redraw 0
goto *main

//弾の生成
*create_circle_bullet
v = 4.0 //弾の速度
a = 0.0
gosub *bullet_check
repeat 20
tx(i,cnt) = 195.0
ty(i,cnt) = 15.0
tvx(i,cnt) = v * cos(a)
tvy(i,cnt) = v * sin(a)
a += 0.162
loop
return

//空いている弾の配列を探す
*bullet_check
repeat 20
if tama(cnt) = 0 : i = cnt : break
loop
if tama(i) = 1 :return
tama(i) = 1
return

乱数の要素を入れる事で、バラバラの弾を撃つこともできます。

randomize
screen 0,400,400

//弾の情報を保持する配列
dim tama,20
ddim tx,10,20
ddim ty,10,20
ddim tvx,10,20
ddim tvy,10,20

*main
color 0,0,0 : boxf 0,0,400,400
color 255,0,0 : pos 190,10 : mes "●"

time++
if time \ 20 = 0:gosub *create_bullet

//弾の処理
color 255,255,255
repeat 10
if tama(cnt) > 0 {
	tama(cnt)++
	if tama(cnt) > 150 :tama(cnt) = 0 //画面から消えて時間が経った弾を消去
	i = cnt
	repeat 20
		tx(i,cnt) += tvx(i,cnt)
		ty(i,cnt) += tvy(i,cnt)
		pset tx(i,cnt),ty(i,cnt)
	loop
}
loop

redraw 1 : wait 3 : redraw 0
goto *main

//弾の生成
*create_bullet
v = 3.0 //弾の速度
a = 0.0
gosub *bullet_check
repeat 20
tx(i,cnt) = 195.0
ty(i,cnt) = 15.0
tvx(i,cnt) = v * cos(a) + double(rnd(20))/10
tvy(i,cnt) = v * sin(a) + double(rnd(20))/10
a += 0.162
loop
return

//空いている弾の配列を探す
*bullet_check
repeat 20
if tama(cnt) = 0 : i = cnt : break
loop
if tama(i) = 1 :return
tama(i) = 1
return