完成間近までなったのですが、ここで問題が出てきました。円形弾幕を発射する敵が、
画面外に出た時に、生存フラグを0にするということを書くのを忘れていたので、その部分を付け足しました。
そして、実行したところ、最初の数発の自機狙い弾が自機をすり抜けていくようになったのです。
if enemy_x2(cnt)>500.0 or enemy_x2(cnt)<-8.0: enemy_f2(cnt) = 0の部分を消すとちゃんと
動くのですが、入れるとちゃんと動きません。なぜでしょうか?
;乱数初期化 randomize buffer 2 font"MSゴシック",40,1 mes "GAME CLEAR!!" ;画面作成 screen 0,500,500 ;変数の確保 jiki_x = 250.0 jiki_y = 400.0 enemy_max = 500 ;自機狙い弾の敵と弾 dim enemy_f,enemy_max ddim enemy_x,enemy_max ddim enemy_y,enemy_max dim e_shot_f,enemy_max ddim e_shot_x,enemy_max ddim e_shot_y,enemy_max ddim e_shot_vx,enemy_max ddim e_shot_vy,enemy_max ;円形弾幕の敵と弾 dim enemy_f2,enemy_max dim enemy_type,enemy_max ddim enemy_x2,enemy_max ddim enemy_vx2,enemy_max ddim enemy_y2,enemy_max dim e_shot_f2,enemy_max ddim e_shot_x2,enemy_max ddim e_shot_y2,enemy_max ddim e_shot_vx2,enemy_max ddim e_shot_vy2,enemy_max frame = 0 time_limit = 8000.00 e_frame = 240 ; 自機狙い弾を発射する間隔 e_time = 720 ; 円形弾幕を発射する間隔 ;メインループ *main ;画面の塗りつぶし color 255,255,255 : boxf ;キー入力取得 stick k,15 if k&1:jiki_x-2.0 if k&2:jiki_y-2.0 if k&4:jiki_x+2.0 if k&8:jiki_y+2.0 if k = 128:end ;画面外に出ないようにする処理 if jiki_x>492:jiki_x = 492.0 if jiki_x<8:jiki_x = 8.0 if jiki_y>492:jiki_y = 492.0 if jiki_y<8:jiki_y = 8.0 ;三角の敵出現 if frame\e_frame = 1 : gosub*enemy_search ;丸の敵出現 if frame\e_time = 1 : gosub*enemy_search2 ;自機狙い弾弾発射 repeat enemy_max if enemy_y(cnt) = 100.0{ enemy_num=cnt gosub*e_shot_search } loop ;円形弾幕発射 repeat enemy_max if enemy_x2(cnt) = 250.0 or enemy_x2(cnt) = 260.0{ e_number = cnt gosub *circle_shot_search } loop ;当たり判定 for i,0,enemy_max,1 ax = jiki_x-enemy_x(i) : ay = jiki_y-enemy_y(i) ax2 = jiki_x-e_shot_x(i) : ay2 = jiki_y-e_shot_y(i) ax3 = jiki_x-enemy_x2(i) : ay3 = jiki_y-enemy_y2(i) ax4 = jiki_x-e_shot_x2(i) : ay4 = jiki_y-e_shot_y2(i) ax = ax*ax : ay = ay*ay ax2 = ax2*ax2 : ay2 = ay2*ay2 ax3 = ax3*ax3 : ay3 = ay3*ay3 ax4 = ax4*ax4 : ay4 = ay4*ay4 if enemy_f(i) = 1{ if ax+ay<=16.0:goto*game_end } if enemy_f2(i) = 1{ if ax2+ay2<=16.0:goto*game_end } if e_shot_f(i) = 1{ if ax3+ay3<=16.0:goto*game_end } if e_shot_f2(i) = 1{ if ax4+ay4<=16.0:goto*game_end } next ;移動と描画 repeat enemy_max if enemy_f(cnt) = 1{ enemy_y(cnt) + 2.0 color 255,0,0 pos enemy_x(cnt)-8.0,enemy_y(cnt)-8.0 mes"▼" } if enemy_y(cnt)>500.0:enemy_f(cnt)=0 if enemy_f2(cnt) = 1{ enemy_x2(cnt)+enemy_vx2(cnt) color 255,0,255 pos enemy_x2(cnt)-8.0,enemy_y2(cnt)-8.0 mes"★" } if e_shot_f(cnt) = 1{ e_shot_x(cnt) = e_shot_x(cnt) + e_shot_vx(cnt) e_shot_y(cnt) = e_shot_y(cnt) + e_shot_vy(cnt) color 255,0,0 pos e_shot_x(cnt)-8.0,e_shot_y(cnt)-8.0 mes"●" } if e_shot_f2(cnt) = 1{ e_shot_x2(cnt) = e_shot_x2(cnt) + e_shot_vx2(cnt) e_shot_y2(cnt) = e_shot_y2(cnt) + e_shot_vy2(cnt) color 255,,255 pos e_shot_x2(cnt)-8,e_shot_y2(cnt)-8 mes"●" } if e_shot_x(cnt)>508.0 or e_shot_x(cnt)<-8.0 or e_shot_y(cnt)>508.0 or e_shot_y(cnt)<-8.0 : e_shot_f(cnt) = 0 if e_shot_x2(cnt)>508.0 or e_shot_x2(cnt)<-8.0 or e_shot_y2(cnt)>508.0 or e_shot_y2(cnt)<-8.0 : e_shot_f2(cnt) = 0 if enemy_y(cnt)>508.0 : enemy_f(cnt) = 0 if enemy_x2(cnt)>508.0 or enemy_x2(cnt)<-8.0: enemy_f2(cnt) = 0 loop ;自機描画 color 0,0,255 pos jiki_x-8.0,jiki_y-8.0 mes"▲" color ,,, pos 0,0 mes "残り時間:あと"+time_limit / 100.0000 if time_limit = 0.0{ goto*game_clear } if frame=1000 or frame = 3000 or frame = 5000{ e_frame = e_frame / 2 e_time = e_time / 2 } redraw 1 redraw 0 await 7 frame++ time_limit-- goto*main ;三角の敵の検索 *enemy_search repeat enemy_max if enemy_f(cnt) =0{ enemy_f(cnt) = 1 enemy_x(cnt) = 1.0+rnd(500) enemy_y(cnt) = -8.0 break } loop return ;自機狙い弾の検索 *e_shot_search repeat enemy_max if e_shot_f(cnt) = 0{ e_shot_f(cnt) = 1 e_shot_x(cnt) = enemy_x(enemy_num) e_shot_y(cnt) = enemy_y(enemy_num) t = atan(jiki_y-e_shot_y(cnt),jiki_x-e_shot_x(cnt)) e_shot_vx(cnt) = cos(t) * 2.5 e_shot_vy(cnt) = sin(t) * 2.5 break } loop return ;丸の敵の検索 *enemy_search2 repeat enemy_max if enemy_f2(cnt) =0{ enemy_f2(cnt) = 1 enemy_type(cnt) = cnt\2 if enemy_type(cnt)=0{ enemy_x2(cnt) = -8.0 enemy_vx2(cnt) = 3.0 }else{ enemy_x2(cnt) = 500.0 enemy_vx2(cnt) = -3.0 } enemy_y2(cnt) = 1.0+rnd(270) break } loop return ;円形弾幕の情報を作成 *circle_shot_search g = 50 ;敵一騎が作成する敵弾数 repeat g t2=m_pi*2*cnt/g ;円形弾幕の一つの弾がもつ角度 gosub *e_shot_search2 if number = -1 : break e_shot_x2(number) = enemy_x2(e_number) e_shot_y2(number) = enemy_y2(e_number) e_shot_f2(number) = 1 e_shot_vx2(number) = cos(t2) * 1.5 e_shot_vy2(number) = sin(t2) * 1.5 loop return ;円形弾幕の検索 *e_shot_search2 number = -1 repeat enemy_max if e_shot_f2(cnt) = 0:number = cnt:break loop return ;被弾した時の処理 *game_end dialog "もう一回チャレンジしますか?",2,"GAME OVER" if stat = 6 :goto*start if stat = 7 : end ;リプレイするときに各値を初期値に戻す *start jiki_x = 1.0+rnd(500) : jiki_y = 400.0 frame = 0 : time_limit = 8000.0 e_frame = 240 : e_time = 720 repeat enemy_max enemy_f(cnt) = 0 enemy_f2(cnt) = 0 e_shot_f(cnt) = 0 e_shot_f2(cnt) = 0 loop goto*main *game_clear color 255,255,255 : boxf redraw 1 pos 100,250 gcopy 2,0,0,400,41 color ,,, pos 10,320 mes "Enterキー : もう一回遊ぶ | スペースキー : ゲームを終了する" repeat getkey key,13 :if key : break getkey key,32 :if key : end await 4 loop goto*start