とりあえず今ある知識を活用して弾幕作ってみました。
効率よく処理するとかはまだよくわかんないので、
スクリプト中で改善すべき所がありましたら
教えてください。お願いします。
//乱数の初期化 randomize //画面初期化 screen 0,400,500 //仮想画面読み込み buffer 1 color 0,255,0:boxf color 0,0,0 mes"▲" color 255,0,0 mes"●" font msgothic, 64,1 color 0,0,255 mes"●" gsel 0 //変数の宣言 frame = 0 jiki_x = 200.0 jiki_y = 300.0 shot_max = 500 ddim e_shot,2,8,shot_max //メインループ開始 *main redraw 0 color 255,255,255:boxf //自機の移動 stick k,31 if(k&1){ jiki_x-=3 if(k&16):jiki_x+=1.5 } if(k&2){ jiki_y-=3 if(k&16):jiki_y+=1.5 } if(k&4){ jiki_x+=3 if(k&16):jiki_x-=1.5 } if(k&8){ jiki_y+=3 if(k&16):jiki_y-=1.5 } if(k&128):end if(jiki_x>400.0-8.0):jiki_x = 400.0-8.0 if(jiki_x<0.0+8.0):jiki_x = 0.0+8.0 if(jiki_y>500.0-8.0):jiki_y = 500.0-8.0 if(jiki_y<0.0+8.0):jiki_y = 0.0+8.0 //弾の出現 if(frame\30==19){ g = 6 trnd = 0.01*rnd(3141) repeat g t = m_pi*2*cnt/g+frame gosub*shot_search e_shot(1,0,shot_number) = 1.0 e_shot(1,1,shot_number) = 200.0 e_shot(1,2,shot_number) = 200.0 e_shot(1,3,shot_number) = cos(t) * 3.0 e_shot(1,4,shot_number) = sin(t) * 3.0 loop } //小弾の出現 if(frame\150=49){ g1 = 30 trnd = 0.01*rnd(3142) repeat g1 t1 = m_pi*2*cnt/g1+trnd gosub*shot_a e_shot(0,0,shot_n) = 1.0 e_shot(0,1,shot_n) = 200.0 e_shot(0,2,shot_n) = 200.0 e_shot(0,3,shot_n) = cos(t1) * 3.0 e_shot(0,4,shot_n) = sin(t1) * 3.0 e_shot(0,5,shot_n) = 0.0 loop } //弾の移動 repeat shot_max e_shot(1,1,cnt)+=e_shot(1,3,cnt) e_shot(1,2,cnt)+=e_shot(1,4,cnt) e_shot(0,1,cnt)+=e_shot(0,3,cnt) e_shot(0,2,cnt)+=e_shot(0,4,cnt) //小弾の下降処理 if(e_shot(0,5,cnt)==50.0){ e_shot(0,3,cnt) = 0.0 e_shot(0,4,cnt) = 0.0 if(e_shot(0,3,cnt) = 0.0 & e_shot(0,4,cnt) = 0.0){ e_shot(0,3,cnt) = -1.0+rnd(4) e_shot(0,4,cnt) = 3.0 } } if(e_shot(1,1,cnt)>400.0+50.0||e_shot(1,2,cnt)>500.0+50.0||e_shot(1,1,cnt)<0.0-50.0||e_shot(1,2,cnt)<0.0-50.0): e_shot(1,0,cnt)=0.0 if(e_shot(0,1,cnt)>400.0+8.0||e_shot(0,2,cnt)>500.0+8.0||e_shot(0,1,cnt)<0.0-8.0||e_shot(0,2,cnt)<0.0-8.0): e_shot(0,0,cnt)=0.0 e_shot(0,5,cnt)++ loop //あたり判定 repeat shot_max //大弾 ex = e_shot(1,1,cnt)-jiki_x : ey = e_shot(1,2,cnt)-jiki_y ex*=ex : ey*=ey //小弾 e_x = e_shot(0,1,cnt)-jiki_x : e_y = e_shot(0,2,cnt)-jiki_y e_x*=e_x : e_y*=e_y if(ex+ey < 256.0)or(e_x+e_y) < 64.0{ end } loop //自機の描画 color 0,255,0 pos jiki_x-8,jiki_y-8 gmode 4,16,16,255 gcopy 1,0,0 //敵弾の描画 repeat shot_max if(e_shot(1,0,cnt)==1.0){ pos e_shot(1,1,cnt)-32,e_shot(1,2,cnt)-32 color 0,255,0 gmode 4,64,64,255 gcopy 1,0,35 } if(e_shot(0,0,cnt)==1.0){ pos e_shot(0,1,cnt)-8,e_shot(0,2,cnt)-8 color 0,255,0 gmode 4,16,18,255 gcopy 1,0,16 } loop redraw 1 wait 1 frame++ goto*main //敵弾(大)の番号の検索 *shot_search shot_number = -1 repeat shot_max if(e_shot(1,0,cnt)!1.0):shot_number = cnt:break loop return //敵弾(小)の番号の検索 *shot_a shot_n = -1 repeat shot_max if(e_shot(0,0,cnt)!1.0):shot_n = cnt:break loop return