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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0115
アイドル【hspdxfix.as】敵弾にくっついている物体を、多次元配列から一次元配列にしたい23解決


アイドル

リンク

2020/1/15(Wed) 14:16:12|NO.89253

どうもこんにちは。
いつもどおりhspdxfix.asプラグインで作った、STGゲームの質問になります。


敵弾を「多次元配列から一次元配列」にしたのですが、
敵弾に「くっついている物体(以下グレイズ)」も、「多次元配列から一次元配列」にしたいと思っていますが、
まだ「多次元配列から一次元配列」にする処理に慣れていないため、どのようにしたらいいのかわからないです。

一応仕様通りに動くソースを用意しましたが、グレイズのみ二次元配列で処理しています。

 ■仕様■
1.でっかい四角やつがグレイズです。下に小さい四角が敵弾です。
2.グレイズは敵弾が画面内にある限り、1弾につき1回しか発生しない。
3.グレイズは敵弾にくっついているので、敵弾と同じ動きをする。
4.敵弾が画面外に行ったら、グレイズ判定の復活をする。
5.敵弾が再発射されたら、グレイズ判定が再度できる
6.敵弾は画面外に行ったら初期の位置に戻る(再発射)


#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 -10,-10, 432,480 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 左下 TEKI_x(0,2) = 230,230,230,230,230 TEKI_y(0,2) = 200,160,120,80,40 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 420,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) ;************************************** es_set 400, JIKI_x,JIKI_y, 400 ;自機 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 1,0,0 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y es_ang TEKI_TM_x,TEKI_TM_y,JIKI_x-4,JIKI_y-4;角度取得 TEKI_TM_ang = stat ;自機の方向 ;*******敵弾発射******* es_set TEKI_TM, TEKI_TM_x,TEKI_TM_y,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no, 214, 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 < 30) or (TEKI_TM_y < 10) or (TEKI_TM_x > 412) or (TEKI_TM_y > 460) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if GURE_HIT_f(cnt,TEK_G) = 0 { ;グレイズにヒットしていない場合【実行】 es_get GURE_x(cnt,TEK_G),TKTM_no,3 ;グレイズX es_get GURE_y(cnt,TEK_G),TKTM_no,5 ;グレイズY ↓本来は-21 es_set GURE_no, GURE_x(cnt,TEK_G)-21,GURE_y(cnt,TEK_G)-51, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop loop ;---当たり判定--- es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;グレイズ【削除】 ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if JK_VS_GURE = GURE_no : GURE_HIT_f(cnt,TEK_G) = 1 ;グレイズヒットフラグを立てる GURE_no++ ;グレイズのスプライト検索開始ID loop loop } ;---画面外判定--- TKTM_no = 200 ;敵弾の場所検索ID repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_get TEKI_GURE_D_x,TKTM_no,3 ;グレイズX es_get TEKI_GURE_D_y,TKTM_no,5 ;グレイズY if (TEKI_GURE_D_x < -10) or (TEKI_GURE_D_y < -10) or (TEKI_GURE_D_x > 412) or (TEKI_GURE_D_y > 460) { GURE_HIT_f(cnt,TEK_G) = 0 ;グレイズヒットフラグ【リセット】 }TKTM_no++ ;敵弾の場所検索ID loop loop return



この記事に返信する


あらや

リンク

2020/1/17(Fri) 01:32:26|NO.89262

すみませんが、質問がザックリし過ぎてないでしょうか?
多分下記の3つの二次元配列をそれぞれ一次元配列にしたいのだと思いますが

;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax

例として、ヒットフラグ(GURE_HIT_f)だけを一次元にさせてもらうと
下記のようにバラバラにする方法

;例1 dim GURE_HIT_G1_f,TEKI_MAX ;グレイズヒットフラグ、グループ1 dim GURE_HIT_G2_f,TEKI_MAX ;グレイズヒットフラグ、グループ2 dim GURE_HIT_G3_f,TEKI_MAX ;グレイズヒットフラグ、グループ3


または一つの配列に全て収める方法

;例2 dim GURE_HIT_f,TEKI_MAX*TEKI_Gmax ;グレイズヒットフラグ
更に2つ目の例の場合、どんな順番で配列に収めたいのか

;例2の1
 まずグループ1を全て入れる
 その次にグループ2を全て
 最後にグループ3を全て
  という順番

;例2の2
 グループ1の1つ目を入れる
 グループ2の1つ目
 グループ3の1つ目
 グループ1の2つ目……
  という順番

パッと考えただけでもこれだけ思いつきますし、どの方法でも可能だと思います。


ついでですが、敵弾もグレイズと同じく二次元配列なので

;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ
敵弾に連動(?)するグレイズも二次元のままの方が管理しやすいのではないでしょうか。



k

リンク

2020/1/17(Fri) 22:29:07|NO.89264

私も二次元のままの方が管理しやすいと思うのですが

多次元配列から一次元配列にしたい理由をもう少し詳しく教えていただければ幸いです(^^



アイドル

リンク

2020/1/18(Sat) 10:12:35|NO.89271

あらやさん、回答ありがとうございます。

わかりずらかったですね・・・
>;例2
> dim GURE_HIT_f,TEKI_MAX*TEKI_Gmax ;グレイズヒットフラグ
考えたかとしてはこれですね。
敵弾はグループ1に5匹入れて、グループ2に5匹入れるっという処理になっているので、
それと同じようにグレイズも管理したいですね。


ダメダメなソースですが、こんな感じで作ってました。
追加下箇所は「---追加---」とコメントしておきます。

#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 -10,-10, 432,480 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;---追加--- dim GURE_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim GURE_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 左下 TEKI_x(0,2) = 230,230,230,230,230 TEKI_y(0,2) = 200,160,120,80,40 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 420,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) ;************************************** es_set 400, JIKI_x,JIKI_y, 400 ;自機 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 1,0,0 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y es_ang TEKI_TM_x,TEKI_TM_y,JIKI_x-4,JIKI_y-4;角度取得 TEKI_TM_ang = stat ;自機の方向 ;*******敵弾発射******* es_set TEKI_TM, TEKI_TM_x,TEKI_TM_y,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no, 214, 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 < 30) or (TEKI_TM_y < 10) or (TEKI_TM_x > 412) or (TEKI_TM_y > 460) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ ;---追加--- TAMA_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_get GURE_x(cnt,TEK_G),TAMA_no,3 ;敵弾X es_get GURE_y(cnt,TEK_G),TAMA_no,5 ;敵弾Y ↓本来は-21 es_set GURE_no, GURE_x(cnt,TEK_G)-21,GURE_y(cnt,TEK_G)-51, 410 es_type GURE_no,128 GURE_NO_GID(GURE_no) = TEK_G ;スプライトNOをキーにグループインデックス格納 GURE_DID = TEK_G * GURE_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) GURE_NO_DID(GURE_no) = GURE_DID ;スプライトNOをキーにデータインデックス格納 TAMA_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop loop TAMA_no = 200 ;敵弾のスプライト検索開始ID dup dup_GURE_HIT_f,GURE_HIT_f ;多次元配列を一次元配列として使用 repeat es_find GURE, 128, TAMA_no,214, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if GURE < 0 : break GURE_DID = GURE_NO_DID(GURE) ;敵スプライトNOをキーに敵データインデックス取り出し ;---当たり判定--- es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;グレイズ【削除】 ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズのスプライト検索開始ID if JK_VS_GURE = GURE_no : GURE_HIT_f(GURE_DID) = 1 ;グレイズヒットフラグを立てる } TAMA_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID loop /* TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if GURE_HIT_f(cnt,TEK_G) = 0 { ;グレイズにヒットしていない場合【実行】 es_get GURE_x(cnt,TEK_G),TKTM_no,3 ;敵弾X es_get GURE_y(cnt,TEK_G),TKTM_no,5 ;敵弾Y ↓本来は-21 es_set GURE_no, GURE_x(cnt,TEK_G)-21,GURE_y(cnt,TEK_G)-51, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop loop ;---当たり判定--- es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;グレイズ【削除】 ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if JK_VS_GURE = GURE_no : GURE_HIT_f(cnt,TEK_G) = 1 ;グレイズヒットフラグを立てる GURE_no++ ;グレイズのスプライト検索開始ID loop loop } ;---画面外判定--- TKTM_no = 200 ;敵弾の場所検索ID repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_get TEKI_GURE_D_x,TKTM_no,3 ;グレイズX es_get TEKI_GURE_D_y,TKTM_no,5 ;グレイズY if (TEKI_GURE_D_x < -10) or (TEKI_GURE_D_y < -10) or (TEKI_GURE_D_x > 412) or (TEKI_GURE_D_y > 460) { GURE_HIT_f(cnt,TEK_G) = 0 ;グレイズヒットフラグ【リセット】 }TKTM_no++ ;敵弾の場所検索ID loop loop */ return



アイドル

リンク

2020/1/18(Sat) 10:20:46|NO.89272

kさん。

>>私も二次元のままの方が管理しやすいと思うのですが
>>多次元配列から一次元配列にしたい理由をもう少し詳しく教えていただければ幸いです(^^
私のような人は二次元配列のほうがいいかもしれません。
以前こちらで敵弾の改善をお聞きしました。
http://hsp.tv/play/pforum.php?mode=all&num=88657

経緯を話すと、基準命令で処理落ちしてしまう為、スプライトで作り直しています。
軽量化をしたいので多次元配列ではなく、一次元配列に変換する処理にしたほうがいいのかなーって思いました。

>>まだ「多次元配列から一次元配列」にする処理に慣れていないため、どのようにしたらいいのかわからないです。
この内容を見てわかるとおり、ばりばりよくわかってないので、
以前指摘された軽量化以外のメリットを答えられません・・・



あらや

リンク

2020/1/19(Sun) 21:38:02|NO.89293

最初のソースの方をベースにして一次元配列に書き換えてみました。

#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 -10,-10, 432,480 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax dup dup_GURE_HIT_f, GURE_HIT_f; dup dup_GURE_x, GURE_x; dup dup_GURE_y, GURE_y; ;---追加--- dim GURE_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim GURE_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 左下 TEKI_x(0,2) = 230,230,230,230,230 TEKI_y(0,2) = 200,160,120,80,40 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 420,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) ;************************************** es_set 400, JIKI_x,JIKI_y, 400 ;自機 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 1,0,0 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y es_ang TEKI_TM_x,TEKI_TM_y,JIKI_x-4,JIKI_y-4;角度取得 TEKI_TM_ang = stat ;自機の方向 ;*******敵弾発射******* es_set TEKI_TM, TEKI_TM_x,TEKI_TM_y,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no, 214, 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 < 30) or (TEKI_TM_y < 10) or (TEKI_TM_x > 412) or (TEKI_TM_y > 460) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID /* repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if GURE_HIT_f(cnt,TEK_G) = 0 { ;グレイズにヒットしていない場合【実行】 es_get GURE_x(cnt,TEK_G),TKTM_no,3 ;グレイズX es_get GURE_y(cnt,TEK_G),TKTM_no,5 ;グレイズY ↓本来は-21 es_set GURE_no, GURE_x(cnt,TEK_G)-21,GURE_y(cnt,TEK_G)-51, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop loop */ repeat TEKI_MAX*TEKI_Gmax if dup_GURE_HIT_f(cnt) = 0 { ;グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;グレイズY ↓本来は-21 es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-51, 410 es_type GURE_no,128 //-----追加&修正-----// TEK_G = cnt / TEKI_MAX; // グループ番号を計算する(0〜4までは0、5〜9までは1、10〜14は2になる) GURE_DID = TEK_G * GURE_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) // 配列変数GURE_NO_GIDは0〜14までなので、GURE_noを入れると410〜424になってしまうため修正 GURE_NO_GID(GURE_DID) = TEK_G ;スプライトNOをキーにグループインデックス格納 // 上記と同じく配列変数GURE_NO_DIDも0〜14までなので修正 GURE_NO_DID(GURE_DID) = GURE_no ;スプライトNOをキーにデータインデックス格納 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop ;---当たり判定--- es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;グレイズ【削除】 ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズのスプライト検索開始ID /* repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if JK_VS_GURE = GURE_no : GURE_HIT_f(cnt,TEK_G) = 1 ;グレイズヒットフラグを立てる GURE_no++ ;グレイズのスプライト検索開始ID loop loop */ repeat TEKI_MAX*TEKI_Gmax if JK_VS_GURE = GURE_no : dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグを立てる GURE_no++ ;グレイズのスプライト検索開始ID loop } ;---画面外判定--- TKTM_no = 200 ;敵弾の場所検索ID /* repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_get TEKI_GURE_D_x,TKTM_no,3 ;グレイズX es_get TEKI_GURE_D_y,TKTM_no,5 ;グレイズY if (TEKI_GURE_D_x < -10) or (TEKI_GURE_D_y < -10) or (TEKI_GURE_D_x > 412) or (TEKI_GURE_D_y > 460) { GURE_HIT_f(cnt,TEK_G) = 0 ;グレイズヒットフラグ【リセット】 }TKTM_no++ ;敵弾の場所検索ID loop loop */ repeat TEKI_MAX*TEKI_Gmax es_get TEKI_GURE_D_x,TKTM_no,3 ;グレイズX es_get TEKI_GURE_D_y,TKTM_no,5 ;グレイズY if (TEKI_GURE_D_x < -10) or (TEKI_GURE_D_y < -10) or (TEKI_GURE_D_x > 412) or (TEKI_GURE_D_y > 460) { dup_GURE_HIT_f(cnt) = 0 ;グレイズヒットフラグ【リセット】 } TKTM_no++ ;敵弾の場所検索ID loop return



以下追加・修正箇所

dupは一回やってしまえばずっと使えるので配列変数の用意と一緒にまとめました。

;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax dup dup_GURE_HIT_f, GURE_HIT_f; dup dup_GURE_x, GURE_x; dup dup_GURE_y, GURE_y;

あとはラベル『*グレイズ』内のrepeat〜loopを
それぞれ一次元バージョンにしたのと
配列変数(GURE_NO_GIDとGURE_NO_DID)の使い方が間違っていた箇所の修正。

当たり判定の周辺は2つ目のソースだと複雑化している割に不具合が多かったので
最初のソースをベースにさせていただきました。



あらや

リンク

2020/1/19(Sun) 21:53:10|NO.89294

すみません、間違えました。
GURE_NO_GIDとGURE_NO_DIDの箇所、
ループが1つなので単にcntを入れるだけで良かったですね……
それに伴って変数GURE_DIDが不要になるので
下記のように修正してください。

//-----追加&修正-----// TEK_G = cnt / TEKI_MAX; // グループ番号を計算する(0〜4までは0、5〜9までは1、10〜14は2になる) ;GURE_DID = TEK_G * GURE_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) // 配列変数GURE_NO_GIDは0〜14までなので、GURE_noを入れると410〜424になってしまうため修正 GURE_NO_GID(cnt) = TEK_G ;スプライトNOをキーにグループインデックス格納 // 上記と同じく配列変数GURE_NO_DIDも0〜14までなので修正 GURE_NO_DID(cnt) = GURE_no ;スプライトNOをキーにデータインデックス格納

失礼いたしました。



アイドル

リンク

2020/1/20(Mon) 22:48:34|NO.89300

あらやさん。回答ありがとうございます。

get宣言後にdup使えることに感動。
そもそもフラグでdupで使っているんだから、他の要素で宣言できることに気がつくべきだった。どうも難しく考えすぎる。

このソースは私のようなペーペーでも、ソースを見ただけでどんな処理をしているかわかりやすくっていいですね!
実は2つめのレス修正は、レス前に気がついていて、修正しているうちに「GURE_NO_GID、GURE_NO_DID」使ってないなーってなっちゃいました。


そして元から色々おかしかったので直しました。レスが遅れたのがこれが原因です。
問題がなければクローズしようかと思います。
・画面外の処理を1つにまとめた
・グレイズの大きさに合わせて、画面外と判定される座標を修正
・それに伴いスプライト表示、有効エリアの範囲修正
・デバックしやすくするため、真ん中のいる敵の位置をずらしました。
・弾が画面外に行ったことをいい感じに確認できるのが、真ん中敵だったので、真ん中の敵から弾を出します


#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 -10,-10, 432,480 ;スプライト有効エリア設定 ;---修正--- es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -13,-43, 442,491 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;---一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 左下→真ん中です! ---修正--- TEKI_x(0,2) = 190,210,230,250,270 TEKI_y(0,2) = 250,210,170,130,90 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 420,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) pos 430,380 : es_mes "TEKI_NO_GID(84) " + TEKI_NO_GID(84) pos 430,400 : es_mes "TEKI_NO_GID(85) " + TEKI_NO_GID(85) pos 430,420 : es_mes "TEKI_NO_GID(90) " + TEKI_NO_GID(90) ;************************************** es_set 400, JIKI_x,JIKI_y, 400 ;自機 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 0,0,1 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y es_ang TEKI_TM_x,TEKI_TM_y,JIKI_x-4,JIKI_y-4;角度取得 TEKI_TM_ang = stat ;自機の方向 ;*******敵弾発射******* es_set TEKI_TM, TEKI_TM_x,TEKI_TM_y,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no,214, 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 < 30) or (TEKI_TM_y < 10) or (TEKI_TM_x > 412) or (TEKI_TM_y > 460) { ;---修正---- if (TEKI_TM_x < -10) or (TEKI_TM_y < -40) or (TEKI_TM_x > 439) or (TEKI_TM_y > 488) { ; TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 ;---追加--- dup_GURE_HIT_f(cnt) = 0 ;グレイズヒットフラグ【リセット】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI if dup_GURE_HIT_f(cnt) = 0 { ;グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;グレイズY es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-21, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop ;---当たり判定--- es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;グレイズ【削除】 ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;15 if JK_VS_GURE = GURE_no : dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグを立てる GURE_no++ ;グレイズのスプライト検索開始ID loop } return



あらや

リンク

2020/1/20(Mon) 23:44:52|NO.89302

最初のソースでは、画面上の方でグレイズと接触すると
自機を画面外に出すまでグレイズが出なくなるという不具合がありましたが
それが無くなっていますね。



少々気になるのが、
ギリギリ画面外あたりに自機を置いているとグレイズの挙動がおかしくなる事でしょうか。

たまに一部のグレイズの動きが画面の外の方で止まってそのまま動かなくなります。
そのグレイズに接触した場合はグレイズ自体は消えるのですが、
敵弾&グレイズが出て来なくなります。

同じく、グレイズと接触したと判断されるくらいの
ギリギリ画面外になりそうな辺りに自機を置いていると
敵弾は再発射されてもグレイズが出て来ないという現象も確認しました。
こちらは自機をウロチョロさせていれば再度グレイズが出て来るようです。



どちらも自機の可動範囲を画面内に限定すれば解決しそうですが。



アイドル

リンク

2020/1/21(Tue) 22:20:49|NO.89315

あらやさん。再度お返事ありがとうございます。

画面ギリギリに関しては大丈夫ですね。
実際に自機が動ける範囲は「左31、上12、下459、右410」までとなっているので、
そこから外側に行ってから消えるようにしたはずなので特に問題はずです。

ここら辺をNo89300の時に言っておけばよかったですね・・・
今度こそ大丈夫なはず・・!



あらや

リンク

2020/1/22(Wed) 00:20:15|NO.89316

先日の報告に少々誤りがありました。

>たまに一部のグレイズの動きが画面の外の方で止まってそのまま動かなくなります。
>そのグレイズに接触した場合はグレイズ自体は消えるのですが、
>敵弾&グレイズが出て来なくなります。
これに関してなのですが、
ごくまれに敵弾が画面外判定されるよりも先に
スプライト有効エリアの外に出てしまう事があるようです。

有効エリアの外に出てしまうとes_findで見つからなくなってしまうので
画面外判定が行なわれない事があるようです。

解決法としては単純にes_areaの範囲を少し広げる
もしくは画面外判定の領域を少し狭くする事で
全てes_findで捕捉出来るはずです。



以降はグレイズに関してですが、
自機とグレイズとの接触が敵弾のように攻撃になるのか、
攻撃の場合、一回当たったらアウトなのか
または複数回でアウトなのか等という仕様に関する問題も出て来るので
何とも言えないのですが、一応報告させていただきます。



グレイズに接触した後、敵弾が画面外に出たとき
消えたはずのグレイズが一瞬画面の端に表示されます。

これは画面外判定時にグレイズのヒットフラグをリセットしているので
その直後にグレイズ関連の処理をするときes_setを行なっているからです。

なので、画面外判定時は0ではなく1にセットし
(1にすれば接触に関係なく表示されなくなるので)
敵弾を再発射するときに0にリセットする方が良いのではないかと思いました。



もう一点、グレイズの接触判定に関してですが
ソースの流れ的に
1フレーム毎にグレイズ1つのみの接触判定になっているので、
同時に複数のグレイズに接触した場合
うまく接触判定が行なわれない可能性があります。

これは一回接触でアウトの場合には問題ありませんが
複数回接触のソースを作ってみました。

;---当たり判定--- GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;15 es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE == -1 : break;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグを立てる } GURE_no++ ;グレイズのスプライト検索開始ID loop



一回だけの接触の場合も少しだけ効率化してみました。

;---当たり判定--- es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;グレイズ【削除】 ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;15 if JK_VS_GURE = GURE_no { dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグを立てる break;以降のループは不要になるためループを終了する } GURE_no++ ;グレイズのスプライト検索開始ID loop }

両方に共通するのは処理が不要になったらbreakでループを抜けるようにしただけです。


以上、長々と失礼いたしました。



あらや

リンク

2020/1/22(Wed) 20:27:24|NO.89319

良く考えたら本題は『多次元配列から一次元配列』の処理に関してでしたね^^;

後半は関係無い話になってしまい申し訳ありませんでした。

元々のご質問だったグレイズの配列に関しては問題ないと思います。



アイドル

リンク

2020/1/22(Wed) 23:03:05|NO.89321

あらやさん。再度返答ありがとうございます!!

>>ごくまれに敵弾が画面外判定されるよりも先に
>>スプライト有効エリアの外に出てしまう事があるようです。
なななななんと!
敵弾のスピードも考慮していませんでした・・・

>>es_area -13,-43, 442,491 ;スプライト有効エリア設定
es_area -18,-48, 447,496 ;スプライト有効エリア設定
5ずつ追加する形で修正したので大丈夫のはずです。


>>自機とグレイズとの接触が敵弾のように攻撃になるのか、
これに関しても補足がなくってすいません・・・
東方Projectを題材に作っているものになるので、「弾をぎりぎりの所で避けるとスコアに点数が加算される」っていうのがグレイズです。


>>グレイズに接触した後、敵弾が画面外に出たとき
>>消えたはずのグレイズが一瞬画面の端に表示されます。
「実際に自機が動ける範囲は「左31、上12、下459、右410」までとなっているので」
これ、↑の回答の時に気がついてました。
この範囲から外はユーザーには見えない部分なのでいいかなーとか甘えちゃいましたが、
やっぱきちんと処理したほうがいいと思いましたので修正します。


>>なので、画面外判定時は0ではなく1にセットし
>>(1にすれば接触に関係なく表示されなくなるので)
>>敵弾を再発射するときに0にリセットする方が良いのではないかと思いました。
■修正中■
こちらの部分が今日中にはちょっと直せそうもないので一旦お返事だけ〜。

「弾をぎりぎりの所で避けるとスコアに点数が加算される」っていう仕様なので、
「if dup_GURE_HIT_f(cnt) = 0 { ;グレイズにヒットしていない場合【実行】」
っていう処理じゃなくってもいいはずなので、作り方を考えようかと思います。


>>1フレーム毎にグレイズ1つのみの接触判定になっているので、
>>同時に複数のグレイズに接触した場合
>>うまく接触判定が行なわれない可能性があります。
グレイズ判定部分はめっさオリジナルですね・・・
だいぶ心配あったのでご指摘助かります!

>>良く考えたら本題は『多次元配列から一次元配列』の処理に関してでしたね
全然問題ないですよー。画面外の話を持ち出したのは私ですしお寿司。
実際このやべぇソースのままだったら色々困ってたので助かりました。



■修正中■以外マージしたもの〜
密かに壁っぽい見た目を入れときました。
自機が画面内までしか動けない(画面外に行けない)はデバックする都合上あえて入れていません。

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,512,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -18,-48, 447,496 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;---追加--- ;枠外 ;--上-- es_size 382,3 es_pat 50, 0,0 es_set 50, 31,12, 50 ;--左-- es_size 3,447 es_pat 51, 0,0 es_set 51, 31,12, 51 ;--下-- es_size 382,3 es_pat 52, 0,0 es_set 52, 31,459, 52 ;--右-- es_size 3,447 es_pat 53, 0,0 es_set 53, 410,12, 53 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;---一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 真ん中 TEKI_x(0,2) = 190,210,230,250,270 TEKI_y(0,2) = 250,210,170,130,90 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 430,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) pos 430,380 : es_mes "TEKI_NO_GID(84) " + TEKI_NO_GID(84) pos 430,400 : es_mes "TEKI_NO_GID(85) " + TEKI_NO_GID(85) pos 430,420 : es_mes "TEKI_NO_GID(90) " + TEKI_NO_GID(90) ;************************************** es_set 400, JIKI_x,JIKI_y, 400 ;自機 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 0,0,1 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y es_ang TEKI_TM_x,TEKI_TM_y,JIKI_x-4,JIKI_y-4;角度取得 TEKI_TM_ang = stat ;自機の方向 ;*******敵弾発射******* es_set TEKI_TM, TEKI_TM_x,TEKI_TM_y,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no,214, 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 < -10) or (TEKI_TM_y < -40) or (TEKI_TM_x > 439) or (TEKI_TM_y > 488) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 dup_GURE_HIT_f(cnt) = 0 ;グレイズヒットフラグ }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI if dup_GURE_HIT_f(cnt) = 0 { ;グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;グレイズY es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-21, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;グレイズのスプライト検索開始ID loop ;---当たり判定--- GURE_no = 410 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;15 es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグを立てる }GURE_no++ ;グレイズのスプライト検索開始ID loop return



アイドル

リンク

2020/1/31(Fri) 15:22:49|NO.89379

だいぶ遅くなりました。
ちょうど用事か重なってしまったので中々ゲーム制作をする時間がとれませんでした(´・ω・`)

あらやさんのヒントを参考にしして処理を追加してみたのですが、思った通りの処理にならなかったことと、
ユーザーには見えない部分で尚且、ユーザーは枠外に出られないので問題ないとすることにしました><
長いお時間取らせたのにいい結果を出せなくってすいませんでした><

本当にありがとうございました!


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,512,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -18,-48, 447,496 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;枠外 ;--上-- es_size 382,3 es_pat 50, 0,0 es_set 50, 31,12, 50 ;--左-- es_size 3,447 es_pat 51, 0,0 es_set 51, 31,12, 51 ;--下-- es_size 382,3 es_pat 52, 0,0 es_set 52, 31,459, 52 ;--右-- es_size 3,447 es_pat 53, 0,0 es_set 53, 410,12, 53 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;敵弾グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;敵弾グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 真ん中 TEKI_x(0,2) = 190,210,230,250,270 TEKI_y(0,2) = 250,210,170,130,90 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 430,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) pos 430,380 : es_mes "GURE_HIT " + GURE_HIT ;************************************** ;自機 es_set 400, JIKI_x,JIKI_y, 400 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 195, TE_x,TE_y, 195 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 0,0,1 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) 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,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ;グレイズを初期化する → このままだと既に発射している弾も初期化される ;画面内の弾のグレイズだけをリセットするか → それだと下でやっている画面外処理の意味があまりない ;他のフラグなどでコントロースすることも考えたけど、管理することを考えるとこのままのほうがよさそう /* dup_GURE_HIT_f(0) = 0 dup_GURE_HIT_f(1) = 0 dup_GURE_HIT_f(2) = 0 dup_GURE_HIT_f(3) = 0 dup_GURE_HIT_f(4) = 0 */ ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no,214, 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 < -15) or (TEKI_TM_y < -45) or (TEKI_TM_x > 444) or (TEKI_TM_y > 493) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 dup_GURE_HIT_f(cnt) = 1 ;敵弾グレイズヒットフラグ【立てる】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 500 ;敵弾グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) if dup_GURE_HIT_f(cnt) = 0 { ;敵弾グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;敵弾グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;敵弾グレイズY es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-21, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;敵弾グレイズのスプライト検索開始ID loop ;---当たり判定--- GURE_no = 500 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグ【立てる】 GURE_HIT++ ;グレイズにあたった回数 }GURE_no++ ;グレイズのスプライト検索開始ID loop return



あらや

リンク

2020/1/31(Fri) 17:15:17|NO.89380

すでに解決済みのようですが、少々手を加えさせていただきました。

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,512,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -18,-48, 447,496 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;枠外 ;--上-- es_size 382,3 es_pat 50, 0,0 es_set 50, 31,12, 50 ;--左-- es_size 3,447 es_pat 51, 0,0 es_set 51, 31,12, 51 ;--下-- es_size 382,3 es_pat 52, 0,0 es_set 52, 31,459, 52 ;--右-- es_size 3,447 es_pat 53, 0,0 es_set 53, 410,12, 53 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;敵弾グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;敵弾グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;追加 各種定数 いくつかは#defineや#constでも可 SP_JIKI = 400 // 自機スプライト SP_TEKI = 80 // 敵スプライト開始 SP_TEKI_TM = 200 // 敵弾スプライト開始 SP_GURE = 500 // グレイズスプライト開始 SP_TEKI_E = SP_TEKI + TEKI_GOKEI - 1 // 敵スプライト終了 SP_TEKI_TM_E = SP_TEKI_TM + TEKI_GOKEI - 1 // 敵弾スプライト終了 SP_GURE_E = SP_GURE + TEKI_GOKEI - 1 // グレイズスプライト終了癲別せ藩僉 SA_GURE_TM = SP_GURE - SP_TEKI_TM // グレイズのスプライト發氾弾のスプライト發虜 ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 真ん中 TEKI_x(0,2) = 190,210,230,250,270 TEKI_y(0,2) = 250,210,170,130,90 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,SP_TEKI,SP_TEKI_E ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,8192 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 430,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) pos 430,160 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,1) pos 430,180 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,1) pos 430,200 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,1) pos 430,220 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,1) pos 430,240 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,1) pos 430,270 : es_mes "GURE_HIT_f(0,1) " + GURE_HIT_f(0,2) pos 430,290 : es_mes "GURE_HIT_f(1,1) " + GURE_HIT_f(1,2) pos 430,310 : es_mes "GURE_HIT_f(2,1) " + GURE_HIT_f(2,2) pos 430,330 : es_mes "GURE_HIT_f(3,1) " + GURE_HIT_f(3,2) pos 430,350 : es_mes "GURE_HIT_f(4,1) " + GURE_HIT_f(4,2) pos 430,380 : es_mes "GURE_HIT " + GURE_HIT ;************************************** ;自機 es_set SP_JIKI, JIKI_x,JIKI_y, 400 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 195, TE_x,TE_y, 195 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 0,0,1 ;配列で弾をコントロール TEKI_no = SP_TEKI ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 8192, TEKI_no,SP_TEKI_E, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,SP_TEKI_TM,SP_TEKI_TM_E ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) 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,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 ;グレイズを初期化する → このままだと既に発射している弾も初期化される ;画面内の弾のグレイズだけをリセットするか → それだと下でやっている画面外処理の意味があまりない ;他のフラグなどでコントロースすることも考えたけど、管理することを考えるとこのままのほうがよさそう /* dup_GURE_HIT_f(0) = 0 dup_GURE_HIT_f(1) = 0 dup_GURE_HIT_f(2) = 0 dup_GURE_HIT_f(3) = 0 dup_GURE_HIT_f(4) = 0 */ dup_GURE_HIT_f(TEKI_TM-SP_TEKI_TM) = 0 ;グレイズヒットフラグ【リセット】 追加 ; } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = SP_TEKI_TM ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no, TEKI_TM_no + TEKI_GOKEI - 1, 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 < -15) or (TEKI_TM_y < -45) or (TEKI_TM_x > 444) or (TEKI_TM_y > 493) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 dup_GURE_HIT_f(cnt) = 1 ;敵弾グレイズヒットフラグ【立てる】 es_kill TEKI_TM + SA_GURE_TM // 念のためグレイズも削除 追加 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = SP_TEKI_TM ;敵弾のスプライト検索開始ID GURE_no = SP_GURE ;敵弾グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) if dup_GURE_HIT_f(cnt) = 0 { ;敵弾グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;敵弾グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;敵弾グレイズY es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-21, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;敵弾グレイズのスプライト検索開始ID loop ;---当たり判定--- GURE_no = SP_GURE ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_check JK_VS_GURE ,SP_JIKI,128 ;400(自機),128(グレイズ) if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグ【立てる】 GURE_HIT++ ;グレイズにあたった回数 }GURE_no++ ;グレイズのスプライト検索開始ID loop return

前々からちょっと気になっていたので、
スプライト番号に直接数値を入れている箇所を
定数的な変数にすることで後で変更しやすくしてみました。

;一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;追加 各種定数 いくつかは#defineや#constでも可 SP_JIKI = 400 // 自機スプライト SP_TEKI = 80 // 敵スプライト開始 SP_TEKI_TM = 200 // 敵弾スプライト開始 SP_GURE = 500 // グレイズスプライト開始 SP_TEKI_E = SP_TEKI + TEKI_GOKEI - 1 // 敵スプライト終了 SP_TEKI_TM_E = SP_TEKI_TM + TEKI_GOKEI - 1 // 敵弾スプライト終了 SP_GURE_E = SP_GURE + TEKI_GOKEI - 1 // グレイズスプライト終了癲別せ藩僉 SA_GURE_TM = SP_GURE - SP_TEKI_TM // グレイズのスプライト發氾弾のスプライト發虜
例えば
>es_exnew TEKI_TM ,200,214 ;新規スプライトNo

>TKTM_no = 200 ;敵弾のスプライト検索開始ID
>GURE_no = 500 ;敵弾グレイズのスプライト検索開始ID
こういった書き方をしていた箇所を
es_exnew TEKI_TM ,SP_TEKI_TM,SP_TEKI_TM_E ;新規スプライトNo

TKTM_no = SP_TEKI_TM ;敵弾のスプライト検索開始ID
GURE_no = SP_GURE ;敵弾グレイズのスプライト検索開始ID
このように変更させていただきました。


そして、定数を利用することでグレイズのリセットや削除も追加してみました。
dup_GURE_HIT_f(TEKI_TM-SP_TEKI_TM) = 0 ;グレイズヒットフラグ【リセット】 追加

es_kill TEKI_TM + SA_GURE_TM // 念のためグレイズも削除 追加


以上です
このような形ではいかがでしょうか。



k

リンク

2020/1/31(Fri) 20:49:36|NO.89381

>だいぶ遅くなりました。
>ちょうど用事か重なってしまったので中々ゲーム制作をする時間がとれませんでした(´・ω・`)
ゲーム制作お疲れ様です(^^

私も昔、東方Projectに興味があったので作ってみたいなーと
考えたことがあったのですが
あのすごい弾幕でも処理落ちをあまりしないように作るのは
大変だろうと判断して断念していました。

が、最近は価格の安いパソコンでもかなり処理能力も
上がってきているので作れるかも とつい思ってしまいます(^^;

当然、そんなに簡単に作れるとは思っていませんが・・・


ところで、余計なお世話かもしれませんが
アイドル様はhspdxfixを使っておられますが
他のプラグインも検討なさったのでしょうか(^^
東方紅魔郷以降のようなゲームだと将来的に荷が重いようにも思うのです
あくまで個人的な意見ですがhgimg3とかも検討してみてはどうでしょうかー・・

じゃー作ってくれと言われてもつらいところではありますが・・・(^^



アイドル

リンク

2020/2/1(Sat) 08:36:25|NO.89383

kさん、お返事ありがとうございます。

HSPで東方Project作っている人がいなかったので、自分で作ってみようって思ってやってますね。
弾幕を再現するのも難しいけど、難しい弾幕を自分が避けないといけないっていうところも難しいです。
っていうのも製作者が避けたことがない(ノーミス)弾幕があると、ユーザーからヘイトを買いますからね(1個ぐらいならいいかもだけど)

自分のPCが3Dオンラインでも動くハイスペックだったせいで、基準命令でもスムーズにうごいてましたが、
普通のスペックPCだと処理が重かったのでスプライトで修正しています。
他のプラグインを検討したことがなかったので、「hgimg3」が使えるかも?っていう情報だけでもありがたいです!



アイドル

リンク

2020/2/1(Sat) 18:01:34|NO.89384

あらやさん、再度お返事ありがとうございます

>>スプライト番号に直接数値を入れている箇所を
>>定数的な変数にすることで後で変更しやすくしてみました。
決まっている数値を変数名にすると何がなんだかわからなくなるため、今段階ではやらないようにしてました。
(そもそも一次元化する処理で手間取っているのに、余計にわかりにくいと感じる要素は入れたくなかった)


ちょっとソースの解析に時間かかりそうなので先にお返事だけしておきます><



ZAP

リンク

2020/2/2(Sun) 00:04:25|NO.89395

hspdxfixはDirectX7世代の古いプラグインだから
すでに環境によってはちゃんと動かないですし、
遅くない将来、サポートがされなくなる可能性があります。

自分は最近、hspdxfixで動かしていたゲームを標準命令で書き直しました。
2Dしか使っていないので、グラボを積んでいないノートPCでも余裕で動いています。
https://www.freem.ne.jp/win/game/21910



アイドル

リンク

2020/2/2(Sun) 14:01:58|NO.89400

あらやさん、改めてお返事ありがとうございます。

>>dup_GURE_HIT_f(TEKI_TM-200) = 0 ;グレイズヒットフラグ【リセット】
こんな感じでリセットしようとして作ってうまくいかなかったですが「-200」だったかー。
弾の番号を調べればよかったんですね><

グレイズも削除したほうがよかったですね。
色々と気を使ってもらえてありがとうございます。


ZAPさん、お返事ありがとうございます。

>>hspdxfixはDirectX7世代の古いプラグインだから
そんな気配がありましたがやはり・・・
基準命令であそこまでおそかったからなぁ。自力で軽量化できる気がしないかなー



k

リンク

2020/2/3(Mon) 00:02:50|NO.89407

>他のプラグインを検討したことがなかったので、
>「hgimg3」が使えるかも?っていう情報だけでもありがたいです!

ちょっとサンプルっぽいのを作ってみました

私のPC(第二世代i5のノート メモリ4G)では
グレイズを非表示にしてやっと負荷0
(処理にかかったミリ秒単位の時間)って感じです

obj番号は新規obj番号なので大体のobj数がわかります
3500個ぐらいかな

repeat 10 を 20 にするとobjが7000個ぐらいになりました(^^;
非表示でも負荷が5、60はいきます(^^;
東方はいくつぐらいobjを使っているのでしょうねー


#include "hgimg3.as" ; グレイズ判定のサンプル ; (カーソルキーで移動、スペースで発射) ; (エンターでグレイズ表示、非表示) screen 0,960,640,0 cls 4 hgsetreq SYSREQ_MAXOBJ,10000 hgini texload2 dir_exe+"/hsptv/tamadot.png" ; テクスチャの登録 texid=stat addspr enemy_model,1,0,0,63,63,texid ; 敵キャラ設定 regobj enemy_obj,enemy_model,OBJ_LATE addpos enemy_obj, 0, -100 addspr my_model,1,0,128,63,191,texid ; 自キャラ設定 regobj my_obj,my_model,OBJ_LATE addpos my_obj, 0, 100 setcoli my_obj,1,2 addspr sword_model,1,256+128,256+64,256+191,256+127,texid; 剣キャラ設定 graze_on=1 clscolor 128 ; 背景色の設定 setborder 960.0f, 640.0f, 200.0f ; クリップ範囲 texmake 160,128 mest = stat font "MS ゴシック",22 color 255,255,255 gmode 2,160,128 *main texcls mest,0 texmes "負荷 "+lag+"\nobj番号 "+sword_obj+"\nグレイズ "+graze,mest,0,0 hgdraw ; 描画処理 pos 320,240 hgrotate mest,0,0,0.0 hgsync 16 ; 時間待ち lag=stat stick k,31 if k&128 : goto *owari if k&1 : addpos my_obj, -4, 0 if k&4 : addpos my_obj, 4, 0 if k&2 : addpos my_obj, 0, -4 if k&8 : addpos my_obj, 0, 4 if k&32 : graze_on=-graze_on if k&16 { repeat 10 ; グレイズ発射 if graze_on=1 { regobj sword_obj,sword_model,OBJ_MOVE|OBJ_BORDER } else { regobj sword_obj,sword_model,OBJ_MOVE|OBJ_BORDER|OBJ_HIDE } setcoli sword_obj,2,1 setscale sword_obj,1.0,1.0 ang=0.001*rnd(6282) setang sword_obj,0,0,3.14*3/4-ang getpos enemy_obj,x,y,z setpos sword_obj,x+sin(ang)*50.0,y+cos(ang)*50.0,z setdir sword_obj, sin(ang)*2.0 , cos(ang)*2.0,0 ;剣発射 regobj sword_obj,sword_model,OBJ_MOVE|OBJ_BORDER setcoli sword_obj,4,1 setscale sword_obj,0.2,0.2 setang sword_obj,0,0,3.14*3/4-ang getpos enemy_obj,x,y,z setpos sword_obj,x+sin(ang)*50.0,y+cos(ang)*50.0,z setdir sword_obj, sin(ang)*2.0 , cos(ang)*2.0,0 loop } repeat getcoli val,my_obj,40.0;グレイズ衝突判定 if val!-1 : delobj val : graze+ : else : break loop goto *main *owari end



アイドル

リンク

2020/2/4(Tue) 22:52:21|NO.89417

kさんソースありがとうございます。

すごく申し訳ないのですが、ぱっと見何をしているのかわからず返答するまでに時間がかかってしまいました。
スペースキーを押すとなにかか起きて、処理を見れるって感じでしょうか。


実はNO.89380のソースで不具合が見つかりまして・・・
画面外の判定でグレイズを削除する処理なんですが、削除されていなくってその原因を調査中で手が回っていないため
kさんソースの解読がざっくり触った程度の返答になっております。


 ■不具合対応による変更点
・デバックしやすくするために、1敵1弾実行したら次の弾を発射しないようにしました。
・再度発射させるためには「スペース」を押せば発射されます。
・「スペース」を押した時に限り1敵2弾実行されてしまいます。
・その他「変更、追加」は「---変更---」「---追加---」とコメントしてあります


かなり長引いたのと、レスが続いてしまい申し訳ないです・・・orz
お時間がかかりそうです。


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,512,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 ;---変更--- →有効エリアの方を多めにとりました--- es_area -36,-76, 449,498 ;スプライト有効エリア設定 ;Y値を-79にしたせいで左上にグレイズが見えるようになっています ;策1:画面外と判定される範囲を小さくする ;策2:敵弾が画面内にあるときのみ、グレイズを処理する ;↑これらは、グレイズが削除されない問題を解決してから取り掛かります ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;枠外 ;--上-- es_size 382,3 es_pat 50, 0,0 es_set 50, 31,12, 50 ;--左-- es_size 3,447 es_pat 51, 0,0 es_set 51, 31,12, 51 ;--下-- es_size 382,3 es_pat 52, 0,0 es_set 52, 31,459, 52 ;--右-- es_size 3,447 es_pat 53, 0,0 es_set 53, 410,12, 53 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;敵弾グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;敵弾グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 真ん中 TEKI_x(0,2) = 190,210,230,250,270 TEKI_y(0,2) = 250,210,170,130,90 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 430,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) ;グレイズの座標取得 GURE_mes_x = 400 ;座標 GURE_no = 500 ;敵弾グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_get GURE_pos_x,GURE_no,3 ;X es_get GURE_pos_y,GURE_no,5 ;Y GURE_mes_x += 40 ;複数見るためにずらす pos GURE_mes_x,160 : es_mes "" + GURE_pos_x ;X pos GURE_mes_x,180 : es_mes "" + GURE_pos_y ;Y GURE_no++ ;敵弾グレイズのスプライト検索開始ID loop pos 430,380 : es_mes "GURE_HIT " + GURE_HIT pos 430,400 : es_mes "TAMA_one_c " + TAMA_one_c ;---追加--- ;************************************** ;自機 es_set 400, JIKI_x,JIKI_y, 400 ;スプライトNo, X,Y座標 ,キャラNo ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 195, TE_x,TE_y, 195 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 0,0,1 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 4096, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break if TAMA_one_c <= 4 { ;---追加--- 何回実行したかカウント(デバック用) TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) 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,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 dup_GURE_HIT_f(TEKI_TM-200) = 0 ;グレイズヒットフラグ【リセット】 TAMA_one_c++ ;---追加--- 何回実行したかカウント(デバック用) ; } } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no,214, 1 if TEKI_TM < 0 : break es_get TEKI_TM_x,TEKI_TM,3 ;敵弾X es_get TEKI_TM_y,TEKI_TM,5 ;敵弾Y ;es_area -36,-76, 449,498 ;スプライト有効エリア設定 ;自機が動ける範囲:31,12 ,410,459 ;グレイズ:-31,-71, 418,467 if (TEKI_TM_x < -10) or (TEKI_TM_y < -50) or (TEKI_TM_x > 439) or (TEKI_TM_y > 488) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 ;原因調査のためコメントアウト /* es_kill TEKI_TM ;敵弾【削除】 es_kill TEKI_TM + 300 ;グレイズ【削除】 */ /* ;敵弾削除→1個外に出るとだめ es_kill 200 es_kill 201 es_kill 202 es_kill 203 es_kill 204 */ ;グレイズが削除されない es_kill 500 es_kill 501 es_kill 502 es_kill 503 es_kill 504 dup_GURE_HIT_f(cnt) = 1 ;敵弾グレイズヒットフラグ【立てる】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 500 ;敵弾グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) if dup_GURE_HIT_f(cnt) = 0 { ;敵弾グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;敵弾グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;敵弾グレイズY es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-21, 410 es_type GURE_no,128 } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;敵弾グレイズのスプライト検索開始ID loop ;---当たり判定--- GURE_no = 500 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグ【立てる】 GURE_HIT++ ;グレイズにあたった回数 }GURE_no++ ;グレイズのスプライト検索開始ID loop return ;*****デバック用****** *デバック用 stick keyS,16 ;スペース if keyS : TAMA_one_c = 0 ;何回実行したかカウント(デバック用) return



アイドル

リンク

2020/2/8(Sat) 22:31:38|NO.89440

だいぶ遅くなりました。
グレイズが画面外に削除されない原因がようやくわかりました。


「グレイズに当たっていない or 画面外」だと「dup_GURE_HIT_f(cnt)」が「0」になっているので、
グレイズのes_setが実行されてしまい、グレイズが削除されなくなってました。
なので、敵弾が画面内にある場合のみ、グレイズをセットすることにしました。

これならば問題なくグレイズが削除できます。
たまに削除できませんがそんときは「画面内」と判定する座標を弄くれば解決します。
今度こそ解決です!(`・ω・´)
------
kさんのソースを改めて。

ソースの方を解読しようとしたのですが、使ったことがない命令ばかりのため、解析にかなり時間かかりそうです。
なので、一旦保留にして気になったときにちまちま解読してみようかと思います。
せっかく出してくれたソースなのに、解読できなくってすいません。



#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,512,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -36,-76, 640,480 ;スプライト表示エリア設定 es_area -36,-76, 449,498 ;スプライト有効エリア設定 ;---グレイズ--- es_size 59,59, 50 es_pat 410, 265,390 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 206 : JIKI_y = 390 ;座標 JIKISpd = 4 ;スピード TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,2 ;---敵--- es_size 18,19, 50 es_pat 60, 0,0 ;---敵弾--- es_size 17,17, 50 es_pat 65, 70,0 ;枠外 ;--上-- es_size 382,3 es_pat 50, 0,0 es_set 50, 31,12, 50 ;--左-- es_size 3,447 es_pat 51, 0,0 es_set 51, 31,12, 51 ;--下-- es_size 382,3 es_pat 52, 0,0 es_set 52, 31,459, 52 ;--右-- es_size 3,447 es_pat 53, 0,0 es_set 53, 410,12, 53 ;敵 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 3 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax ;フラグ dim TEKI_x,TEKI_MAX,TEKI_Gmax ;X dim TEKI_y,TEKI_MAX,TEKI_Gmax ;Y dim TEKI_NO_GID,15 ;敵スプライトNOを使って敵グループインデックス用 (スプライトの最大数) dim TEKI_NO_DID,15 ;敵スプライトNOを使って敵データインデックス格納用 (スプライトの最大数) ;敵弾 dim TEKI_TM_f,TEKI_MAX,TEKI_Gmax;フラグ dim NOMARU_TAMA,TEKI_GOKEI ;弾出すフラグ ;敵弾グレイズ dim GURE_HIT_f,TEKI_MAX,TEKI_Gmax ;敵弾グレイズヒットフラグ dim GURE_x,TEKI_MAX,TEKI_Gmax dim GURE_y,TEKI_MAX,TEKI_Gmax ;一次元配列にする--- dup dup_GURE_HIT_f, GURE_HIT_f ;ヒットフラグ dup dup_GURE_x, GURE_x ;X dup dup_GURE_y, GURE_y ;Y ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 右上 TEKI_x(0,0) = 390,390,390,390,390 TEKI_y(0,0) = 200,160,120,80,40 ;グループ2 左上 TEKI_x(0,1) = 50,50,50,50,50 TEKI_y(0,1) = 200,160,120,80,40 ;グループ3 真ん中 TEKI_x(0,2) = 190,210,230,250,270 TEKI_y(0,2) = 250,210,170,130,90 ;■■■敵配置■■■ repeat TEKI_Gmax ;グループ数(3) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI ,80,94 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 ;敵弾出し分けするための処理 TEKI_NO_GID(TEKI) = TEK_G ;スプライトNOをキーにグループインデックス格納 TEKI_DID = TEK_G * TEKI_MAX + cnt ;データインデックス(一次元配列とした場合のインデックス) TEKI_NO_DID(TEKI) = TEKI_DID ;スプライトNOをキーにデータインデックス格納 loop loop ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 430,20 : es_mes "TEKI_DID " + TEKI_DID pos 430,50 : es_mes "GURE_HIT_f(0,0) " + GURE_HIT_f(0,0) pos 430,70 : es_mes "GURE_HIT_f(1,0) " + GURE_HIT_f(1,0) pos 430,90 : es_mes "GURE_HIT_f(2,0) " + GURE_HIT_f(2,0) pos 430,110 : es_mes "GURE_HIT_f(3,0) " + GURE_HIT_f(3,0) pos 430,130 : es_mes "GURE_HIT_f(4,0) " + GURE_HIT_f(4,0) ;グレイズの座標取得 GURE_mes_x = 400 ;座標 GURE_no = 500 ;敵弾グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_get GURE_pos_x,GURE_no,3 ;X es_get GURE_pos_y,GURE_no,5 ;Y GURE_mes_x += 40 ;複数見るためにずらす pos GURE_mes_x,160 : es_mes "" + GURE_pos_x ;X pos GURE_mes_x,180 : es_mes "" + GURE_pos_y ;Y GURE_no++ ;敵弾グレイズのスプライト検索開始ID loop pos 430,380 : es_mes "GURE_HIT " + GURE_HIT pos 430,400 : es_mes "TAMA_one_c " + TAMA_one_c ;************************************** ;自機 es_set 400, JIKI_x,JIKI_y, 400 ;スプライトNo, X,Y座標 ,キャラNo ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 195, TE_x,TE_y, 195 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 ;*************敵弾移動**************** *敵弾移動 if NOMARU_f = 0 : NOMARU_TAMA = 0,0,1 ;配列で弾をコントロール TEKI_no = 80 ;敵のスプライト検索開始NO dup dup_TEKI_TM_f,TEKI_TM_f ;多次元配列を一次元配列として使用 repeat es_find TEKI, 4096, TEKI_no,94, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break if TAMA_one_c <= 4 { ;何回実行したかカウント(デバック用) TEK_G = TEKI_NO_GID(TEKI) ;敵スプライトNOをキーにグループインデックス取り出し if NOMARU_TAMA(TEK_G) = 1 { ;コントロールした弾だけを出す TEKI_DID = TEKI_NO_DID(TEKI) ;敵スプライトNOをキーに敵データインデックス取り出し if dup_TEKI_TM_f(TEKI_DID) = 0 { es_exnew TEKI_TM ,200,214 ;新規スプライトNo ; if TEKI_TM > 0 { ;保険 dup_TEKI_TM_f(TEKI_DID) = 1 ;一次元配列にしてるので敵データインデックスをキーにフラグ設定 TAMA_NO_DID(TEKI_TM) = TEKI_DID;弾のスプライトNOをキーに敵データインデックス格納(これで弾と敵データとの紐付) 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,65 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 dup_GURE_HIT_f(TEKI_TM-200) = 0 ;グレイズヒットフラグ【リセット】 TAMA_one_c++ ;何回実行したかカウント(デバック用) ; } } } }TEKI_no++;敵のスプライト検索開始NO loop ;---画面外判定--- TEKI_TM_no = 200 ;敵弾のスプライト検索開始NO repeat es_find TEKI_TM, 32, TEKI_TM_no,214, 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 < -50) or (TEKI_TM_x > 439) or (TEKI_TM_y > 488) { TEKI_DID = TAMA_NO_DID(TEKI_TM) ;弾のスプライトNOをキーに敵データインデックス取り出し dup_TEKI_TM_f(TEKI_DID) = 0 ;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 es_kill TEKI_TM + 300 ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;敵弾グレイズヒットフラグ【立てる】 }TEKI_TM_no++ ;敵弾のスプライト検索開始NO loop return ;*************グレイズ**************** *グレイズ TKTM_no = 200 ;敵弾のスプライト検索開始ID GURE_no = 500 ;敵弾グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_get TEKI_TM_x,TKTM_no,5 ;敵弾X es_get TEKI_TM_y,TKTM_no,5 ;敵弾Y if (TEKI_TM_x < -33) or (TEKI_TM_y < -58) or (TEKI_TM_x < 443) or (TEKI_TM_y < 488) { ;--追加--- if dup_GURE_HIT_f(cnt) = 0 { ;敵弾グレイズにヒットしていない場合【実行】 es_get dup_GURE_x(cnt),TKTM_no,3 ;敵弾グレイズX es_get dup_GURE_y(cnt),TKTM_no,5 ;敵弾グレイズY es_set GURE_no, dup_GURE_x(cnt)-21,dup_GURE_y(cnt)-21, 410 es_type GURE_no,128 } } TKTM_no++ ;敵弾のスプライト検索開始ID GURE_no++ ;敵弾グレイズのスプライト検索開始ID loop ;---当たり判定--- GURE_no = 500 ;グレイズのスプライト検索開始ID repeat TEKI_GOKEI ;敵合計数(15) es_check JK_VS_GURE ,400,128 ;400(自機),128(グレイズ) if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 dup_GURE_HIT_f(cnt) = 1 ;グレイズヒットフラグ【立てる】 GURE_HIT++ ;グレイズにあたった回数 }GURE_no++ ;グレイズのスプライト検索開始ID loop return ;*****デバック用****** *デバック用 stick keyS,16 ;スペース if keyS : TAMA_one_c = 0 ;何回実行したかカウント(デバック用) return



k

リンク

2020/2/10(Mon) 21:07:14|NO.89461

>ソースの方を解読しようとしたのですが、使ったことがない命令ばかりのため、解析にかなり時間かかりそうです。
>なので、一旦保留にして気になったときにちまちま解読してみようかと思います。
>せっかく出してくれたソースなのに、解読できなくってすいません。
コメントありがとうございます
サクッと作ったものなので、お気になさらず(^^



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.89253への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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