完成間近までなったのですが、ここで問題が出てきました。円形弾幕を発射する敵が、
画面外に出た時に、生存フラグを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



