HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2021
0907
アイドル【hspdxfix.as】グレイズが消えてしまう1解決


アイドル

リンク

2021/9/7(Tue) 16:50:46|NO.93797

どうもこんにちは。
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



この記事に返信する


アイドル

リンク

2021/9/12(Sun) 19:01:24|NO.93859

自機狙いも赤札も5500スクリプトで管理してたため消えてました。
一つの上限で同時に作成する文には問題ないのですが、
自機狙いと赤札は別々の処理のためスクリプト番号をずらす必要がありました。
(「GURE_no = 5100 ;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 = 5100;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



ONION software Copyright 1997-2023(c) All rights reserved.