NO.4997で変数名に漢字を使っちゃったから面倒なのでそのまま・・・
#include "hspdxfix.as"
screen 0,640,480,0
es_ini
es_screen 640,480,16,,1,1
if stat=0 : goto *start
dialog "エラー",1
end
*start
gosub *datinit
es_window 0,0,640,480
buffer 10,256,256
cls 4:color 0,100,250:grect 16,16,3.1415/4,24,24:color 0,200,00:circle 32,0,32+32,32:color 100,150,250:boxf 64+14,2,64+14+4,30:color 200,100,050:circle 64+12+32,8,64+12+8+32,30
mref se_stat,64:se_stat=0:es_buffer 10,0,0,,1:if stat=1 :dialog "エラー",1:end
es_size 32,32,100,0:es_pat 1,0,0,0:es_new myspno,0:es_set myspno,250,250,1,1,0
es_pat 2,32,0,0 :es_size 32,32,60,0 :es_pat pat弾A,64,0,0 :es_pat pat弾B,96,0,0
gsel 0
repeat
es_exboxf 0,0,640,480,$4040
stick ky,255:if ky&128{end}
if ky&1{x-4}else{if ky&4{x+4}} :if ky&2{y-4}else{if ky&8{y+4}} :x=limit(x,0,640-32):y=limit(y,0,480-32):es_pos myspno,x,y
if (ky&(16+64)){kycnt++}else{kycnt=0}
if (kycnt\8)=1 {
//スペース=貫通弾 : コントロール=通常弾
if ky&16 {type弾=type弾A :pat弾=pat弾A :spd弾=spd弾A} else {type弾=type弾B :pat弾=pat弾B :spd弾=spd弾B}
repeat 4 ;一度に4発撃つ
es_new 弾No,弾No0
if 弾No<弾No終了 {
es_set 弾No,弾x(cnt)+x,弾y(cnt)+y,pat弾,1,0 :es_type 弾No,type弾 :es_adir 弾No,32,spd弾
//弾にIDを付ける
弾ID++ :弾(弾No)=弾ID
}
loop
}
if 敵数<敵Max{
es_new 敵No,敵No0 :es_set 敵No,rnd(440)+100,rnd(200)+50,2,1,0 :es_type 敵No,type敵
//敵に違う弾が当たった数のカウンタをクリア
敵当数(敵No)=0 :HP(敵No)=20 :敵数++
}
if 敵数{gosub *check}
es_draw 0
color 250,100,0
for 敵No,敵No0,敵No終了+1
es_find 敵No,type敵,敵No,敵No終了
if 敵No<0 {_break}
es_get 敵x,敵No,3 :es_get 敵y,敵No,5
pos 敵x+8,敵y+8 :es_mes str(HP(敵No))
c=limit(敵当数(敵No),0,当数Max)
repeat c
pos 敵x+16,敵y+16+cnt*16 :es_fmes str(敵(cnt,敵No))
loop
next
es_sync 16,1 :await 0 :es_getfps fps :title str(fps)
loop
*datinit
弾Max=50 :敵Max=10 :当数Max=10 ;弾Max,敵Maxはそれぞれの最大数 :当数Maxは一つの敵で弾のIDを保存できる数(これを越えた時は最初に戻り上書きされる)
x=300:y=400 :弾No0=50:弾No終了=弾No0+弾Max :敵No0=200:敵No終了=敵No0+敵Max
弾x=-8,8,-20,20:弾y=-8,-8,0,0 :spd弾A=1200:spd弾B=800 :type弾A=2:type弾B=4:type敵=256 :pat弾A=3:pat弾B=4 :spmax=512
dim HP,spmax ;スプライトNoを利用するのでスプライトの使える最大数(初期値)まで確保
dim 弾,spmax ;弾のID用
dim 敵,当数Max,spmax ;当たった弾のIDを入れる
dim 敵当数,spmax ;違う弾が当たったカウント用
return
*check
for 弾No,弾No0,弾No終了+1
es_find 弾No,type弾A+type弾B,弾No,弾No終了
if 弾No<0 {_break}
for 敵No,敵No0,敵No終了+1
es_check 敵No,弾No,type敵,p4,敵No,敵No終了
if 敵No<0 {_break}
es_get type,弾No,13
if type弾A=type {;貫通弾(攻撃力1)
n=弾(弾No) ;弾のIDを取り出す
c=limit(敵当数(敵No),0,当数Max) ;違う弾が当たった数を取り出す(当数Maxを上限として)
for checkcnt,0,c
if 敵(checkcnt,敵No)=n {checkcnt=-1:_break} ;現在の弾と同じIDがすでに当たっていたら途中で終了(checkcnt=-1で途中で終わった事を記録)
next
if checkcnt=c { ;最後までチェックが出来たから同じ弾は当たっていない
敵(敵当数(敵No)\当数Max,敵No)=n ;弾のIDを入れる(入れる場所を 0〜(当数Max-1) でループさせる)
敵当数(敵No)++ ;違う弾が当たった数をカウント
HP(敵No)-- ;HPを減らす
}
}else{HP(敵No)-3 :es_kill 弾No} ;通常弾(攻撃力3)
if HP(敵No)<1{es_kill 敵No:敵数-- :_break}
next
next
return
この方法だと、弾の速度や数、敵の判定の大きさによって「当数Max」を調節する必要があるかも
一回当たった弾が、敵から抜ける前に「当数Max」以上の弾数に当たると上書きされるので
再度当たる事になる