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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0703
アイドル【hspdxfix.as】二次元配列を使って敵からアイテムを出したい1解決


アイドル

リンク

2019/7/3(Wed) 20:51:48|NO.87810

どうもアイドルです。

二次元配列の処理ってこんなにも厄介だったっけ・・・
ってなわけで二次元配列を使って、敵からアイテムを出したいのですが、
二次元目においた敵からアイテムが出なくって困っています。

いい加減スプライトの扱いに慣れたいです・・どうも苦手だ。
些細なことでもいいのです。アドバイスありましたら教えてください!

■仕様■
・敵1匹を倒すと、その敵からアイテムを1個出す
・アイテムを取得するか、一番下(画面外)まで行くとアイテムが消滅する
・アイテム1個につき、1回しか判定しない
(今回アイテムとの当たり判定は必要ないと思われますが、
ソースの書きかたによって、アイテム1個を複数回獲得出来てしまう場合があるので、ソースに記載しておきます)


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,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 12,12, 100 es_pat 300, 1,80 ;---自機--- es_size 28,42, 100 JIKI_x = 206 : JIKI_y = 390 es_pat 400, 0, 0 ;---自機弾--- es_size 11,11, 100 es_pat 51, 1,43 ;---敵---60〜170 es_size 18,19, 50 es_pat 60, 0,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 2 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax dim TEKI_x,TEKI_MAX,TEKI_Gmax dim TEKI_y,TEKI_MAX,TEKI_Gmax ;敵アイテム TEKI_MAX = 5 dim TEKI_DS_AI_f,TEKI_MAX,TEKI_Gmax ;敵アイテムを出すフラグ dim P_AI_f,TEKI_MAX,TEKI_Gmax dim P_AI_x,TEKI_MAX,TEKI_Gmax dim P_AI_y,TEKI_MAX,TEKI_Gmax ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 左 TEKI_x(0,0) = 30,70,110,150,190 TEKI_y(0,0) = 30,30,30,30,30 ;グループ2 右 TEKI_x(0,1) = 230,270,310,350,390 TEKI_y(0,1) = 50,50,50,50,50 ;************メインループ*************** *メイン es_cls es_draw pos 420,20 : es_mes "TK_HIT " + TK_HIT pos 420,40 : es_mes "AITEM_HIT " + AITEM_HIT pos 420,80 : es_mes "TEKI_DS_AI_f(0,0) " + TEKI_DS_AI_f(0,0) pos 420,100 : es_mes "TEKI_DS_AI_f(1,0) " + TEKI_DS_AI_f(1,0) pos 420,120 : es_mes "TEKI_DS_AI_f(2,0) " + TEKI_DS_AI_f(2,0) pos 420,140 : es_mes "TEKI_DS_AI_f(3,0) " + TEKI_DS_AI_f(3,0) pos 420,160 : es_mes "TEKI_DS_AI_f(4,0) " + TEKI_DS_AI_f(4,0) pos 420,190 : es_mes "TEKI_DS_AI_f(0,1) " + TEKI_DS_AI_f(0,1) pos 420,210 : es_mes "TEKI_DS_AI_f(1,1) " + TEKI_DS_AI_f(1,1) pos 420,230 : es_mes "TEKI_DS_AI_f(2,1) " + TEKI_DS_AI_f(2,1) pos 420,250 : es_mes "TEKI_DS_AI_f(3,1) " + TEKI_DS_AI_f(3,1) pos 420,270 : es_mes "TEKI_DS_AI_f(4,1) " + TEKI_DS_AI_f(4,1) ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *敵アイテム gosub *デバック用に表示させる ;自機関連 es_set 400, JIKI_x,JIKI_y, 400 ;自機表示 JIKISpd = 4 ;自機のスピード 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 ;*************敵**************** *敵 repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt,TEK_G) = 0 { TEKI_f(cnt,TEK_G) = 1 es_exnew TEKI, 80,190 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 } loop loop ;自機弾VS敵 当たり判定 TEKI_no = 80 ;敵の検索開始ナンバ− repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_D, 4096, TEKI_no,190 es_check TEKI_VS_TAMA ,TEKI_D,2 if TEKI_VS_TAMA != -1 { TK_HIT += 1 ;自機弾が敵にあたった回数を増加する_【デバック用】 es_kill TEKI_D ;敵_【削除】 es_kill TEKI_VS_TAMA;自機弾_【削除】 TEKI_DS_AI_f(cnt,TEK_G) = 1 ;アイテムを出すフラグ_【立てる】 }TEKI_no++ ;グレイズの場所検索ID loop loop /* ;敵検索IDと、2次元配列IDで分ける。(これだとダメ) TEKI_no = 80 ;敵の検索開始ナンバ− repeat 10 es_find TEKI_D, 4096, TEKI_no,190 es_check TEKI_VS_TAMA ,TEKI_D,2 if TEKI_VS_TAMA != -1 { es_kill TEKI_D ;敵_【削除】 es_kill TEKI_VS_TAMA;自機弾_【削除】 ;アイテム出現 TEKI_NIJUI_no = 80 ;敵の二次元検索ID repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if JIKI_VS_TEKI_AI = TEKI_NIJUI_no : TEKI_DS_AI_f(cnt,TEK_G) = 1 ;アイテムを出すフラグ_【立てる】 TEKI_NIJUI_no++ ;敵の二次元検索ID_【増加】 loop loop }TEKI_no++ ;敵の検索開始ID_【増加】 loop */ return ;************敵アイテム***************** *敵アイテム TKTM_no = 80 ;敵の検索ID P_AI_no = 95 ;敵アイテムの検索ID(95) repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if TEKI_DS_AI_f(cnt,TEK_G) = 1 { ;アイテムを出すフラグが立ってたら_【実行】 if P_AI_f(cnt,TEK_G) = 0 { P_AI_f(cnt,TEK_G) = 1 ;Pフラグ_【立てる】 es_get P_AI_x(cnt,TEK_G),TKTM_no,3 ;スプライトのX座標 es_get P_AI_y(cnt,TEK_G),TKTM_no,5 ;スプライトのY座標 es_set P_AI_no, P_AI_x(cnt,TEK_G),P_AI_y(cnt,TEK_G),300 ;スプライトNo, X,Y座標 ,キャラNo es_apos P_AI_no, 0,1 ,100 ;下に移動 es_type P_AI_no,8 ;アイテムtype値(8) } } TKTM_no++ ;敵の検索ID_【増加】 P_AI_no++ ;敵アイテムの検索ID_【増加】 loop loop ;当たり判定 ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI ,400,8 if JIKI_VS_TEKI_AI != -1 { es_kill JIKI_VS_TEKI_AI ;スプライト削除(敵アイテム) AITEM_HIT++ ;自機がアイテムにあたった回数を増加する_【デバック用】 P_AI_no = 95 ;敵アイテムの検索開始ID repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if JIKI_VS_TEKI_AI = P_AI_no : TEKI_DS_AI_f(cnt,TEK_G) = 2 P_AI_no++ ;敵アイテムの検索開始ID_【増加】 loop loop } return ;*****デバック用に表示させる****** *デバック用に表示させる P_AI_mes_x = 20 ;デバック用に表示させる座標 P_AI_mes_y = 300;デバック用に表示させる座標 P_AI_no = 95 ;敵アイテムの検索開始ID repeat TEKI_GOKEI ;敵合計数 es_get P_AI_pos_x,P_AI_no,3 ;アイテムX es_get P_AI_pos_y,P_AI_no,5 ;アイテムY if cnt = 5 : P_AI_mes_x = 20 if cnt = 5 : P_AI_mes_y = 350 P_AI_mes_x += 40 ;複数見るためにずらす pos P_AI_mes_x,P_AI_mes_y : es_mes "" + P_AI_pos_x ;X pos P_AI_mes_x,P_AI_mes_y+20 : es_mes "" + P_AI_pos_y ;Y P_AI_no++ ;敵アイテムの検索開始ID_【増加】 loop return



この記事に返信する


アイドル

リンク

2019/7/13(Sat) 23:18:54|NO.87861

少し期間空きましたが多分自己解決できました。

なんかものすごく簡単な追加でした・・・とほほ
自己流の解決なので不具合あるかもしれません。不具合などあったら追記しておきます。


 ■追加■
・アイテムが一番下まで行ったらフラグを2にする (多分必要ない。保険)
・処理をする前に2次元配列でフラグが立っているか確認する

当たり判定やらアイテム出現やらをする前に、2次元配列でフラグが立っているか確認することによって、
1つ1つ判定できるようになりました。
( (0,0) = 0 → (0,0) = 1 → (0,0)はもう0ではないので実行されない → これを連続して実行するだけ )



#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,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 12,12, 100 es_pat 300, 1,80 ;---自機--- es_size 28,42, 100 JIKI_x = 206 : JIKI_y = 390 es_pat 400, 0, 0 ;---自機弾--- es_size 11,11, 100 es_pat 51, 1,43 ;---敵---60〜170 es_size 18,19, 50 es_pat 60, 0,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 TEKI_Gmax = 2 ;グループ数 TEKI_GOKEI = TEKI_MAX * TEKI_Gmax ;敵合計数 dim TEKI_f,TEKI_MAX,TEKI_Gmax dim TEKI_x,TEKI_MAX,TEKI_Gmax dim TEKI_y,TEKI_MAX,TEKI_Gmax ;敵アイテム TEKI_MAX = 5 dim TEKI_DS_AI_f,TEKI_MAX,TEKI_Gmax ;敵アイテムを出すフラグ dim P_AI_f,TEKI_MAX,TEKI_Gmax dim P_AI_x,TEKI_MAX,TEKI_Gmax dim P_AI_y,TEKI_MAX,TEKI_Gmax ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ ;グループ1 左 TEKI_x(0,0) = 30,70,110,150,190 TEKI_y(0,0) = 30,30,30,30,30 ;グループ2 右 TEKI_x(0,1) = 230,270,310,350,390 TEKI_y(0,1) = 50,50,50,50,50 ;************メインループ*************** *メイン es_cls es_draw pos 420,20 : es_mes "TK_HIT " + TK_HIT pos 420,40 : es_mes "AITEM_HIT " + AITEM_HIT pos 420,80 : es_mes "TEKI_DS_AI_f(0,0) " + TEKI_DS_AI_f(0,0) pos 420,100 : es_mes "TEKI_DS_AI_f(1,0) " + TEKI_DS_AI_f(1,0) pos 420,120 : es_mes "TEKI_DS_AI_f(2,0) " + TEKI_DS_AI_f(2,0) pos 420,140 : es_mes "TEKI_DS_AI_f(3,0) " + TEKI_DS_AI_f(3,0) pos 420,160 : es_mes "TEKI_DS_AI_f(4,0) " + TEKI_DS_AI_f(4,0) pos 420,190 : es_mes "TEKI_DS_AI_f(0,1) " + TEKI_DS_AI_f(0,1) pos 420,210 : es_mes "TEKI_DS_AI_f(1,1) " + TEKI_DS_AI_f(1,1) pos 420,230 : es_mes "TEKI_DS_AI_f(2,1) " + TEKI_DS_AI_f(2,1) pos 420,250 : es_mes "TEKI_DS_AI_f(3,1) " + TEKI_DS_AI_f(3,1) pos 420,270 : es_mes "TEKI_DS_AI_f(4,1) " + TEKI_DS_AI_f(4,1) ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *敵アイテム gosub *デバック用に表示させる ;自機関連 es_set 400, JIKI_x,JIKI_y, 400 ;自機表示 JIKISpd = 4 ;自機のスピード 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 ;*************敵**************** *敵 repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt,TEK_G) = 0 { TEKI_f(cnt,TEK_G) = 1 es_exnew TEKI, 80,190 ;新規スプライトNo es_set TEKI, TEKI_x(cnt,TEK_G),TEKI_y(cnt,TEK_G), 60 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 } loop loop ;当たり判定、アイテム出現 TEKI_no = 80 ;敵の検索開始ID repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if TEKI_DS_AI_f(cnt,TEK_G) = 0 { es_find TEKI_D, 4096, TEKI_no,190 es_check TEKI_VS_TAMA ,TEKI_D,2 if TEKI_VS_TAMA != -1 { es_kill TEKI_D ;敵_【削除】 es_kill TEKI_VS_TAMA;自機弾_【削除】 TEKI_DS_AI_f(cnt,TEK_G) = 1 ;アイテムを出すフラグ_【立てる】 } }TEKI_no++ ;敵の検索開始ID_【増加】 loop loop return ;************敵アイテム***************** *敵アイテム TKTM_no = 80 ;敵の検索ID P_AI_no = 95 ;敵アイテムの検索ID(95) repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if TEKI_DS_AI_f(cnt,TEK_G) = 1 { ;アイテムを出すフラグが立ってたら_【実行】 if P_AI_f(cnt,TEK_G) = 0 { P_AI_f(cnt,TEK_G) = 1 ;Pフラグ_【立てる】 es_get P_AI_x(cnt,TEK_G),TKTM_no,3 ;スプライトのX座標 es_get P_AI_y(cnt,TEK_G),TKTM_no,5 ;スプライトのY座標 es_set P_AI_no, P_AI_x(cnt,TEK_G),P_AI_y(cnt,TEK_G),300 ;スプライトNo, X,Y座標 ,キャラNo es_apos P_AI_no, 0,1 ,100 ;下に移動 es_type P_AI_no,8 ;アイテムtype値(8) } } TKTM_no++ ;敵の検索ID_【増加】 P_AI_no++ ;敵アイテムの検索ID_【増加】 loop loop ;当たり判定 ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI ,400,8 if JIKI_VS_TEKI_AI != -1 { es_kill JIKI_VS_TEKI_AI ;スプライト削除(敵アイテム) AITEM_HIT++ ;自機がアイテムにあたった回数を増加する_【デバック用】 P_AI_no = 95 ;敵アイテムの検索開始ID repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) if JIKI_VS_TEKI_AI = P_AI_no : TEKI_DS_AI_f(cnt,TEK_G) = 2 P_AI_no++ ;敵アイテムの検索開始ID_【増加】 loop loop } ;一番下まで行ったら P_AI_no = 95 ;アイテムの検索開始ID(90) repeat TEKI_Gmax ;グループ数(2) TEK_G = cnt repeat TEKI_MAX ;敵の最大数(5) es_get P_AI_Di_y,P_AI_no,5 ;弾Y if P_AI_Di_y >= 480 { TEKI_DS_AI_f(cnt,TEK_G) = 2 ;アイテムを出すフラグ(2にしてカウントなどを実行しない) } P_AI_no++ ;敵アイテムの検索ID loop loop return ;*****デバック用に表示させる****** *デバック用に表示させる P_AI_mes_x = 20 ;デバック用に表示させる座標 P_AI_mes_y = 300;デバック用に表示させる座標 P_AI_no = 95 ;敵アイテムの検索開始ID repeat TEKI_GOKEI ;敵合計数 es_get P_AI_pos_x,P_AI_no,3 ;アイテムX es_get P_AI_pos_y,P_AI_no,5 ;アイテムY if cnt = 5 : P_AI_mes_x = 20 if cnt = 5 : P_AI_mes_y = 350 P_AI_mes_x += 40 ;複数見るためにずらす pos P_AI_mes_x,P_AI_mes_y : es_mes "" + P_AI_pos_x ;X pos P_AI_mes_x,P_AI_mes_y+20 : es_mes "" + P_AI_pos_y ;Y P_AI_no++ ;敵アイテムの検索開始ID_【増加】 loop return



記事削除

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

NO.87810への返信

マスコット

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

名前

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

削除用パスワード

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

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

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