hspdxfix.asプラグインで作ったSTGゲームになります。
いつもどおりですが東方Projectにあるグレイズ処理で困ったことがあったので質問します。
■やりたいこと
「1段階目:自機狙い」を撃破したとき「2段階目」に移る
「2段階目」のときも「自機狙い」と「札弾」がある。
「2段階目」のとき「自機狙い」発射してから少し経過すると、
「自機狙い」のグレイズが消えてしまうのでグレイズがついたままにしたい。
■仕様
・自機狙い:1発
・札弾:4*11の二次元配列
・自機狙い:画面外に行くと再発射される
・札弾:結界にぶつかると再発射される
・グレイズは全ての弾に追尾する
(わかりやすくするためサイズを「es_size 50,20」にしてます)
・グレイズは一括処理でスプライト5500から生成するようにしている
#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 7100,7100,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -55,-430, 600,498 ;スプライト有効エリア設定 ;---敵弾グレイズ--- es_size 50,20, 50 es_pat 600, 0,632 ;---自機--- es_size 28,42, 100 es_pat 4000, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;自機位置 TE_x = 206+10 : TE_y = 390+16 ;低速位置 JIKISpd = 4 ;自機のスピード(4) ;---自機弾--- es_size 11,11, 150 es_pat 51, 1,43 ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;------ es_size 27,59, 100 es_pat 1100, 66,61 ;札弾 es_size 13,15, 50 es_pat 1000, 14,0 ;■■■結界当たり判定用■■■ ;---上下--- KEKAI_s = 4101 ;スプライト値 KEKAI_sy = 300,380,472, 166,86,-7 ;スプライト値代入 repeat 6 es_size 112,6, 100 es_pat KEKAI_s, 134,598 KEKAI_s++ loop ;---左右--- /* KEKAI_s = 4107 ;スプライト値 KEKAI_sx = 271,341,420, 165,95,16 ;スプライト値代入 repeat 6 es_size 6,134, 100 es_pat KEKAI_s, 240,464 KEKAI_s++ loop */ ;札弾 AK_MAX = 4 ;札弾の最大数(4) AK_G_MAX = 12 ;グループ数 dim REI_AK_f, AK_MAX,AK_G_MAX ;フラグ dim REI_AK_x, AK_MAX,AK_G_MAX ;X dim REI_AK_y, AK_MAX,AK_G_MAX ;Y ;****************札弾配置*************** ;下 REI_AK_x(0,0) = 177,205,230,252 REI_AK_y(0,0) = 227,227,227,227 /* REI_AK_x(0,1) = 177,205,230,252 REI_AK_y(0,1) = 307,307,307,307 REI_AK_x(0,2) = 177,205,230,252 REI_AK_y(0,2) = 386,386,386,386 ;上 REI_AK_x(0,3) = 177,205,230,252 REI_AK_y(0,3) = 230,230,230,230 REI_AK_x(0,4) = 177,205,230,252 REI_AK_y(0,4) = 150,150,150,150 REI_AK_x(0,5) = 177,205,230,252 REI_AK_y(0,5) = 70,70,70,70 ;右 REI_AK_x(0,6) = 205,205,205,205 REI_AK_y(0,6) = 183,218,254,289 REI_AK_x(0,7) = 275,275,275,275 REI_AK_y(0,7) = 183,218,254,289 REI_AK_x(0,8) = 345,345,345,345 REI_AK_y(0,8) = 183,218,254,289 ;左 REI_AK_x(0,9) = 225,225,225,225 REI_AK_y(0,9) = 183,218,254,289 REI_AK_x(0,10) = 155,155,155,155 REI_AK_y(0,10) = 183,218,254,289 REI_AK_x(0,11) = 85,85,85,85 REI_AK_y(0,11) = 183,218,254,289 */ ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;***********カウンター*************** pos 450,260 : es_mes "撃破フラグ " + REIMU_GEKIH_f ;*************メインループ**************** ;自機 es_set 4000, JIKI_x,JIKI_y, 4000 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 70, TE_x,TE_y, 70 ;************gosub************ gosub *自機の移動 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 ;****************ボスの処理************* *ボスの処理 if REIMU_f = 0 { REIMU_f = 1 REIMU_x = 208 : REIMU_y = 70 es_set 1100, 208,70, 1100 es_type 1100,4096 } ;---当たり判定--- es_check TEKI_VS_TAMA ,1100,2;札弾 VS 自機の低速 if TEKI_VS_TAMA != -1 { es_kill TEKI_VS_TAMA;自機弾【削除】 REIMU_GEKIH_f = 1 ;撃破フラグを【立てる】 } ;***********自機狙い*********** *自機狙い es_get REIMU_TM_x,1100,3 ;X es_get REIMU_TM_y,1100,5 ;Y if REIMU_TM_f = 0 { ;自機狙い弾フラグ REIMU_TM_f = 1 ;自機狙い弾フラグ es_ang REIMU_TM_x,REIMU_TM_y,TE_x-12,TE_y-12 ;角度取得 REIMU_ang = stat ;自機の方向 ;*******弾発射******* es_set 1000, REIMU_x+12,REIMU_y+10,1000 ;スプライト設定 es_adir 1000, REIMU_ang,300 ;スプライト移動方向設定 es_type 1000,32 GURE_TYPE = 1 ;グレイズタイプ gosub *グレイズ処理 } ;---画面外判定--- es_get REIMU_TM_x,1000,3 ;弾X es_get REIMU_TM_y,1000,5 ;弾Y if (REIMU_TM_x < 30-15) or (REIMU_TM_y < 10-13) or (REIMU_TM_x > 412+13) or (REIMU_TM_y > 460+15) { REIMU_TM_f = 0 ;弾フラグ【初期化】 es_kill 1000 ;弾【削除】 } return ;*************弾幕************** *弾幕 ;---結界の上下--- if REIMU_GEKIH_f = 1 { KEKAI_s = 4101 ;スプライト値 repeat 6 es_set KEKAI_s, 165,KEKAI_sy(cnt), KEKAI_s KEKAI_s++ loop ;---結界の左右--- /* KEKAI_s = 4107 ;スプライト値 repeat 6 es_set KEKAI_s, KEKAI_sx(cnt),166, KEKAI_s KEKAI_s++ loop */ ;---札弾--- repeat AK_G_MAX ;グループ数(12) TEK_G = cnt repeat AK_MAX ;弾の最大数(4) if REI_AK_f(cnt,TEK_G) = 0 { ;二重のフラグ REI_AK_f(cnt,TEK_G) = 1 ;二重のフラグ es_exnew RI_SP_D, 1500,1547 REI_AK_xx = REI_AK_x(cnt,TEK_G) : REI_AK_yy = REI_AK_y(cnt,TEK_G) ;座標記録 es_set RI_SP_D, REI_AK_xx,REI_AK_yy, 1000 es_type RI_SP_D,512 es_apos RI_SP_D, 0,1 ;↓に移動 /* if TEK_G >= 3 : es_apos RI_SP_D, 0,-1 ;↑に移動 if TEK_G >= 6 : es_apos RI_SP_D, 1,0 ;→に移動 if TEK_G >= 9 : es_apos RI_SP_D, -1,0 ;←に移動 */ ;---グレイズ情報--- if TEK_G <= 2 : GURE_TYPE = 4 ;グレイズ↓タイプ /* if TEK_G >= 3 : GURE_TYPE = 5 ;グレイズ↑タイプ if TEK_G >= 6 : GURE_TYPE = 6 ;グレイズ→タイプ if TEK_G >= 9 : GURE_TYPE = 7 ;グレイズ←タイプ */ gosub *グレイズ処理 } loop loop ;---結界削除判定--- RI_SP_no = 4101 ;結界プライト検索開始ナンバー repeat 12 TEK_G = cnt repeat ;結界に接触する可能性のある赤札を全て確認 es_check RI_SP_VS_KEKKAI ,RI_SP_no,512 if RI_SP_VS_KEKKAI != -1 { es_kill RI_SP_VS_KEKKAI ;【削除】 REI_AK_f(cnt,TEK_G) = 0 ;二重のフラグ } else { break ;接触している赤札が無ければループを抜ける } loop RI_SP_no++ loop } return ;***********グレイズ処理*********** *グレイズ処理 ;自機狙い if GURE_TYPE = 1 { GURE_no = 5500 es_set GURE_no, REIMU_x-11,REIMU_y-11, 600 es_adir GURE_no, REIMU_ang,300 } ;---上下左右--- if GURE_TYPE = 4 { GURE_no = RI_SP_D + 4000;1500+4000 es_set GURE_no, REI_AK_xx-20, REI_AK_yy-20, 600 es_apos GURE_no, 0,1 } /* if GURE_TYPE = 5 { GURE_no = RI_SP_D + 4000;1500+4000 es_set GURE_no, REI_AK_xx-20, REI_AK_yy-20, 600 es_apos GURE_no, 0,-1 } if GURE_TYPE = 6 { GURE_no = RI_SP_D + 4000;1500+4000 es_set GURE_no, REI_AK_xx-20, REI_AK_yy-20, 600 es_apos GURE_no, 1,0 } if GURE_TYPE = 7 { GURE_no = RI_SP_D + 4000;1500+4000 es_set GURE_no, REI_AK_xx-20, REI_AK_yy-20, 600 es_apos GURE_no, -1,0 } */ return