弾幕を張ります。
まず変数を宣言します。弾の情報として弾の座標、弾の速度が必要です。
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