いつもどおりhspdxfix.asプラグインで作ったSTGゲームです。
敵の配列を0から撃破すると、次の敵に存在してた敵分の弾が実行されてしまい困ってます。
一番左にいる敵を倒すと、TEKI_TM_f(0)に「1」が立っているので、
次の敵が1発なところ2発打っている状況になってしまいます・・
分かりづらい場合は一番右側の敵を残すとわかりやすいかも。
「考察」
枠外に行ったら弾フラグを「0」にするので、それのせいで再実行されているから、
敵を撃破したときに弾フラグを「2」にして、枠外実行を弾フラグ「1以下」のときに実行とかやってみたのですが、
この方法でもうまくいかず・・・
最大の配列数から撃破すると発生しないとで、何かやらかしていると思います。
自力で解決できると思ったんですが、久し振りのせいか全然ダメダメなので質問しました・・・orz
■仕様■
1.敵1匹に対する弾数は1個
2.敵を撃破したら、その敵の弾を実行しない
#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,512,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window 30,10, 412,460 ;スプライト表示エリア設定 es_area -43,-68, 440,498 ;スプライト有効エリア設定 ;---自機--- es_size 28,42, 100 es_pat 350, 0, 0 JIKI_x = 80 : JIKI_y = 400 TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;---自機弾--- es_size 11,11, 150 es_pat 51, 1,43 ;---敵--- es_size 50,50, 100 es_pat 320, 19,0 ;---敵弾--- es_size 34,34, 25 es_pat 75, 125,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX ;フラグ ;弾敵弾 dim TEKI_TM_f,TEKI_MAX ;フラグ ;▼▼▼▼▼敵配列▼▼▼▼▼ TEKI_x = 100,150,200,250,300 TEKI_y = 350,280,210,140,70 ;■■■敵配置■■■ repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI, 320,324 ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 320 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 loop ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 480,20 : es_mes "TEKI_TM_f(0) " + TEKI_TM_f(0) pos 480,40 : es_mes "TEKI_TM_f(1) " + TEKI_TM_f(1) pos 480,60 : es_mes "TEKI_TM_f(2) " + TEKI_TM_f(2) pos 480,80 : es_mes "TEKI_TM_f(3) " + TEKI_TM_f(3) pos 480,100 : es_mes "TEKI_TM_f(4) " + TEKI_TM_f(4) ;*****************ゲーム枠外*************** es_set 350, JIKI_x,JIKI_y, 350 ;自機 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 70, TE_x,TE_y, 70 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード(2) } else { JIKISpd = 4 ;自機のスピード(4) } ;************gosub************ gosub *自機の移動 gosub *自機弾移動 gosub *敵弾移動 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動************* *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 getkey keyZ,90 ;Zキー JK_TAMA_G_kazu = 0 if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- if JK_TAMA_c >= 1 { JK_TAMA_dai_Kz = JK_TAMA_c \ 2 if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1 } JK_TAMA_c++ ;ループ内カウンター if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側 if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側 JKSO_y = JIKI_y es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo es_apos JK_TAMA, 0,-15 ,100 ;↑に移動 RENSA = 2 ;弾の間隔 es_type JK_TAMA,2 ;自機弾type値(2) } if RENSA > 0 : RENSA -= 1 ;弾の間隔 return ;*************敵弾移動**************** *敵弾移動 ;当たり判定 TEKI_no = 320 ;敵のスプライト検索開始ナンバー repeat TEKI_MAX ;敵の最大数(5) es_check TEKI_VS_TAMA ,TEKI_no,2 if TEKI_VS_TAMA != -1 & TEKI_f(cnt) = 0 { TEKI_SP_D = TEKI_no - 320 TEKI_f(TEKI_SP_D) = 1 ;敵フラグを「立てる」 es_kill TEKI_no ;敵「削除」 es_kill TEKI_VS_TAMA;自機弾「削除」 }TEKI_no++ ;敵のスプライト検索開始ナンバー loop ;敵弾 TEKI_no = 320 ;敵のスプライト検索開始ナンバー repeat es_find TEKI, 4096, TEKI_no,324, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break if TEKI_TM_f(TEKI-320) = 0 { ;敵弾フラグが立ってないときに実行 es_exnew TEKI_TM, 340,350 ;新規スプライト取得 TEKI_TM_f(TEKI_TM-340) = 1 ;敵弾フラグを【立てる】 es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y es_ang TEKI_TM_x,TEKI_TM_y,TE_x-4,TE_y-4;角度取得 TEKI_TM_ang = stat ;自機の方向 ;*******敵弾発射******* es_set TEKI_TM, TEKI_TM_x,TEKI_TM_y,75 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 }TEKI_no++ ;敵弾のスプライト検索開始ナンバー loop ;---画面外判定--- TEKI_TM_no = 340 ;敵弾のスプライト検索開始ナンバー repeat es_find TEKI_TM, 32, TEKI_TM_no,350, 1 if TEKI_TM < 0 : break es_get TEKI_TM_x,TEKI_TM,3 ;敵弾X es_get TEKI_TM_y,TEKI_TM,5 ;敵弾Y if (TEKI_TM_x < -33) or (TEKI_TM_y < -58) or (TEKI_TM_x > 435) or (TEKI_TM_y > 488) { TEKI_TM_f(TEKI_TM-340) = 0;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 }TEKI_TM_no++ ;敵弾のスプライト検索開始ナンバー loop return