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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0808
アイドル【hspdxfix.as】複数種類のアイテムを個別に判断したい10解決


アイドル

リンク

2019/8/8(Thu) 21:27:53|NO.88021

少しお久しぶりです。

hspdxfix.asプラグインを使って複数種類のアイテムを出すことができたのですが、
種類ごとに判断をスマートに変える方法が思い浮かばなかったので質問します。
独特な作り方と、マイナーだと思われるプラグインなので、2週間ほど返答なかったら削除します。

今回、敵処理内にあるアイテム準備は処理が難しいので 銑Δ泙波峭罎鮨兇辰討澆泙靴拭
初の試みなので逆に見づらかったらすいません。


 ■仕様■
・敵から出現するアイテムは合計で4個
・アイテム4個の内、2個はパワーアイテム、2個は点数
・パワーアイテム:自機強化、点数アイテム:点数増加
・点アイテムはわかりやすく縦に長くしています(本来はパワーアイテムと同じ大きさ)

 ☆やりたいこと☆
アイテムはスプライトで処理しているので、スプライトNoで個々に判断したい。
(この作り方だと、細かく判断するしか無いと思われるので、他の作り方がいいよっていうアドバイスでも可)

 ▲プラグイン仕様上やりにくいこと▲
・パワーアイテム、点数アイテムを別々に処理して、点数アイテムのtypeを16とかにする。
 →typeは「1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768」の16種類しか使えないのであまり増やしたくない
(「ボム増加、1アップ」なども入れるので、typeが膨らむと大変なことに)

●やったこと●
/**/でコメントアウトしていることがやったことになります。

 ・増加してずらしてみる
アイテムスプライトの開始が150なので、「AI_no_c = 150」で代入する。
「アイテムの検索開始ナンバ−」と一致していれば、パワーアイテムを増加する。
そして、代入してた変数を+1増加させて・・・

そもそもアイテムと当たったときは、一瞬しか判断されないので足し算を行っても「AI_no_c = 150」でリセットされる。


 ・グループ分け
判断したいスプライトNoを「or」でまとめて、条件に達していればフラグを立てて、フラグが立っていればパワーアイテムを増加。
これだとフラグで判断してしまうため、どれをとっても「パワーアイテム」と判断されてしまう。



#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,-30, 412,460 ;スプライト表示エリア設定 es_area 10,-30, 432,480 ;スプライト有効エリア設定 ;---パワーアイテム--- es_size 12,12, 100 es_pat 150, 1,80 ;---点アイテム--- es_size 12,20, 100 es_pat 180, 14,80 ;---自機--- es_size 28,42, 100 es_pat 400, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;座標 ;---自機弾--- es_size 11,11, 100 es_pat 51, 1,43 ;---敵--- es_size 50,38, 100 es_pat 70, 19,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;敵アイテム TEKI_AI_MAX = 20 ;アイテムの最大数 dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ dim P_AI_x,TEKI_AI_MAX dim P_AI_y,TEKI_AI_MAX ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ TEKI_x = 80,150,220,290,360 TEKI_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls es_draw pos 420,10 : es_mes "AI_HIT " + AI_HIT pos 420,30 : es_mes "TN_HIT " + TN_HIT pos 420,80 : es_mes "TEKI_DS_AI_f(0) " + TEKI_DS_AI_f(0) pos 420,100 : es_mes "TEKI_DS_AI_f(1) " + TEKI_DS_AI_f(1) pos 420,120 : es_mes "TEKI_DS_AI_f(2) " + TEKI_DS_AI_f(2) pos 420,140 : es_mes "TEKI_DS_AI_f(3) " + TEKI_DS_AI_f(3) pos 420,160 : es_mes "TEKI_DS_AI_f(4) " + TEKI_DS_AI_f(4) pos 420,190 : es_mes "TEKI_DS_AI_f(5) " + TEKI_DS_AI_f(5) pos 420,210 : es_mes "TEKI_DS_AI_f(6) " + TEKI_DS_AI_f(6) pos 420,230 : es_mes "TEKI_DS_AI_f(7) " + TEKI_DS_AI_f(7) pos 420,250 : es_mes "TEKI_DS_AI_f(8) " + TEKI_DS_AI_f(8) pos 420,270 : es_mes "TEKI_DS_AI_f(9) " + TEKI_DS_AI_f(9) ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *敵アイテム es_set 400, JIKI_x,JIKI_y, 400 ;自機表示 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動 if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動 if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動 if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 JK_TAMA_G_kazu = 0 getkey keyZ,90 ;Zキー if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- 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値 } if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする return ;*************敵**************** *敵 repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI, 80,84 ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 } loop ;自機弾VS敵 当たり判定 TEKI_no = 80 ;敵の検索開始ナンバ− AI_c = 0 ; 屮▲ぅ謄爛侫薀阿鬟ンにした回数」 AI_KZ = 4 ;◆屮▲ぅ謄狄堯 repeat TEKI_MAX ;敵の最大数(5) es_find TEKI_D, 4096, TEKI_no,84 ;「敵スプライト80〜84の間を探す」 es_check TEKI_VS_TAMA ,TEKI_D,2 ;ぁ崚┐自機弾と当たったら変数に-1を代入」 ;アイテムスイッチ TEKI_AI_DI_cnt = 0 ;ァ屮▲ぅ謄倏枌嵎儿后 TEKI_AI_no = 80 ;Α屮▲ぅ謄倏枌岾始ナンバ−」 repeat TEKI_MAX ;敵の最大数(5) ;「80〜84の間を探した結果」、Α屮▲ぅ謄倏枌岾始ナンバ−」が一致したら実行 (80 = 80,81 = 81...) if TEKI_D = TEKI_AI_no { TEKI_AI_cnt = TEKI_AI_DI_cnt ;Α屮▲ぅ謄倏枌嵎儿后廚侶覯未鬮Г紡綟する (0,4...) } TEKI_AI_DI_cnt += AI_KZ ;ァ屮▲ぅ謄倏枌嵎儿后廖+ ◆屮▲ぅ謄狄堯(0,4...) TEKI_AI_no += 1 ;Α屮▲ぅ謄倏枌岾始ナンバ−」を「増加」 loop ;あたったら実行 if TEKI_VS_TAMA != -1 { ; es_kill TEKI_D ;自機弾「削除」 es_kill TEKI_VS_TAMA ;敵「削除」 ;アイテムループ開始地点を変更することによって、好きな数づつずらすことができます repeat TEKI_AI_MAX, TEKI_AI_cnt ;敵アイテム数(10), (0,4...) TEKI_DS_AI_f(cnt) = 1 ;アイテムを出すフラグを「立てる」 AI_c++ if AI_c == AI_KZ : break ; 屮▲ぅ謄爛侫薀阿鬟ンにした回数」と ◆屮▲ぅ謄狄堯廚一致したらループから抜ける loop }TEKI_no++ loop return ;************敵アイテム***************** *敵アイテム TKTM_no = 80 ;敵の検索ナンバ− AI_no = 150 ;アイテムの検索開始ナンバ− repeat TEKI_MAX * AI_KZ ;敵の最大数 * ◆屮▲ぅ謄狄堯 (5 * 4 = 20) if TEKI_DS_AI_f(cnt) = 1 { ;アイテムを出すフラグ es_get P_AI_x(cnt),TKTM_no,3 ;スプライトX座標 es_get P_AI_y(cnt),TKTM_no,5 ;スプライトY座標 ;キャラ番号をパワーから点数に変える if AI_TUGI <= 1 : AI_HN = 150 if AI_TUGI >= 2 : AI_HN = 180 es_set AI_no, P_AI_x(cnt) + AI_TUGI*15, P_AI_y(cnt),AI_HN ;スプライトNo, X,Y座標 ,キャラNo es_apos AI_no, 0,-1 ,100 ;↑に移動 es_type AI_no,8 ;アイテムtype値(8) } ;アイテムを出す位置調整 AI_TUGI_c++ ;┘▲ぅ謄狒り AI_TUGI = AI_TUGI_c \ AI_KZ ;┘▲ぅ謄狒り \ ◆屮▲ぅ謄狄堯 (1 \ 4 = 1,2 \ 4 = 2) if AI_TUGI = 0 : TKTM_no++ ;余りが0だったら、敵の検索ナンバ−を「増加」 if AI_TUGI_c >= AI_KZ : AI_TUGI_c = 0 ;敵の検索ナンバ− AI_no++ ;敵の検索ナンバ− loop ;当たり判定 ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI ,400,8 if JIKI_VS_TEKI_AI != -1 { es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」 AI_no = 150 ;アイテムの検索開始ナンバ− repeat TEKI_AI_MAX ;敵のアイテム数(10) if JIKI_VS_TEKI_AI = AI_no { ;取ったアイテムとアイテムの検索開始ナンバ−が一致したら「実行」 /* ;増加してずらしてみる → あたった瞬間のみ増加するので一瞬で通り過ぎてしまい、2つめ以降は認識されない AI_no_c = 150 if AI_no = AI_no_c : AI_HIT++ : AI_no_c += 1;点アイテム増加 if AI_no = AI_no_c : AI_HIT++ : AI_no_c += 3;点アイテム増加 */ /* ;グループ分け → フラグが立っちゃっているので、どっち取得しても判断される if AI_no = 150 or AI_no = 151 or AI_no = 154 or AI_no = 155 : AI_TN = 1 if AI_TN = 1 : AI_HIT++ ;パワーアイテム増加 */ ;個々にアイテムを判断する ;パワーアイテム増加 if AI_no = 150 or AI_no = 151 or AI_no = 154 or AI_no = 155 : AI_HIT++ if AI_no = 158 or AI_no = 159 or AI_no = 162 or AI_no = 163 : AI_HIT++ if AI_no = 166 or AI_no = 167 or AI_no = 170 or AI_no = 171 : AI_HIT++ if AI_no = 174 or AI_no = 175 or AI_no = 178 or AI_no = 189 : AI_HIT++ if AI_no = 182 or AI_no = 183 or AI_no = 186 or AI_no = 197 : AI_HIT++ ;点アイテム増加 if AI_no = 152 or AI_no = 153 or AI_no = 156 or AI_no = 157 : TN_HIT++ if AI_no = 160 or AI_no = 161 or AI_no = 164 or AI_no = 165 : TN_HIT++ if AI_no = 168 or AI_no = 169 or AI_no = 172 or AI_no = 173 : TN_HIT++ if AI_no = 176 or AI_no = 177 or AI_no = 180 or AI_no = 181 : TN_HIT++ if AI_no = 184 or AI_no = 185 or AI_no = 188 or AI_no = 189 : TN_HIT++ TEKI_DS_AI_f(cnt) = 2 ;アイテムを出すフラグを2にする } AI_no++ ;アイテムの検索開始ナンバ− loop } return



この記事に返信する


砂時 計

リンク

2019/8/14(Wed) 22:10:56|NO.88045

itemtypes という配列を用意して
そこに パワーアップ とか 得点 の種別を格納するような方法でやってみました。


#include "hspdxfix.as" ;DXライブラリ使用 #const BIT_MYSHOT 2 #const BIT_ITEM 8 #const BIT_TEKI 4096 // アイテム種別 #enum ITEM_NONE = 0 #enum ITEM_POWER #enum ITEM_PTS #enum ITEM_BOMB #enum ITEM_ONEUP // アイテムに割り振るスプライトnoの開始と個数 #const ITEM_SPR_HEAD 150 #const ITEM_SPR_NUM 20 #const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1) #const TEKI_SPR_HEAD 80 #const TEKI_SPR_NUM 5 #const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1) // 自機スプライトno #const MY_SPR 511 // キャラクタno #const CHR_POWER 150 #const CHR_PTS 180 #const CHR_MY 400 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window 30,-30, 412,460 ;スプライト表示エリア設定 es_area 10,-30, 432,480 ;スプライト有効エリア設定 ;---パワーアイテム--- es_size 12,12, 100 es_pat CHR_POWER, 1,80 ;---点アイテム--- es_size 12,20, 100 es_pat CHR_PTS, 14,80 ;---自機--- es_size 28,42, 100 es_pat CHR_MY, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;座標 ;---自機弾--- es_size 11,11, 100 es_pat 51, 1,43 ;---敵--- es_size 50,38, 100 es_pat 70, 19,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;敵アイテム TEKI_AI_MAX = 20 ;アイテムの最大数 dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ // 追加 dim itemtypes, TEKI_AI_MAX dim itemtekiindices, TEKI_AI_MAX foreach itemtekiindices itemtekiindices(cnt) = -1 loop ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ TEKI_x = 80,150,220,290,360 TEKI_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls es_draw pos 420,10 : es_mes "AI_HIT " + AI_HIT pos 420,30 : es_mes "TN_HIT " + TN_HIT /* pos 420,80 : es_mes "TEKI_DS_AI_f(0) " + TEKI_DS_AI_f(0) pos 420,100 : es_mes "TEKI_DS_AI_f(1) " + TEKI_DS_AI_f(1) pos 420,120 : es_mes "TEKI_DS_AI_f(2) " + TEKI_DS_AI_f(2) pos 420,140 : es_mes "TEKI_DS_AI_f(3) " + TEKI_DS_AI_f(3) pos 420,160 : es_mes "TEKI_DS_AI_f(4) " + TEKI_DS_AI_f(4) pos 420,190 : es_mes "TEKI_DS_AI_f(5) " + TEKI_DS_AI_f(5) pos 420,210 : es_mes "TEKI_DS_AI_f(6) " + TEKI_DS_AI_f(6) pos 420,230 : es_mes "TEKI_DS_AI_f(7) " + TEKI_DS_AI_f(7) pos 420,250 : es_mes "TEKI_DS_AI_f(8) " + TEKI_DS_AI_f(8) pos 420,270 : es_mes "TEKI_DS_AI_f(9) " + TEKI_DS_AI_f(9) */ ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *当たり判定 es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動 if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動 if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動 if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 JK_TAMA_G_kazu = 0 getkey keyZ,90 ;Zキー if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- 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, BIT_MYSHOT ;type値 } if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする return ;*************敵**************** *敵 repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI, BIT_TEKI } loop ;自機弾VS敵 当たり判定 TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ− AI_KZ = 4 ;◆屮▲ぅ謄狄堯 repeat es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;「敵スプライト80〜84の間を探す」 if TEKI_D == -1 { break } es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;ぁ崚┐自機弾と当たったら変数に not -1を代入」 ;あたったら実行 if TEKI_VS_TAMA != -1 { TKTM_no = TEKI_D gosub *敵アイテム es_kill TEKI_D ;敵「削除」 es_kill TEKI_VS_TAMA ;自弾「削除」 } TEKI_no++ loop return ;************敵アイテム***************** *敵アイテム es_get x,TKTM_no,3 ;スプライトX座標 es_get y,TKTM_no,5 ;スプライトY座標 repeat AI_KZ AI_TUGI = cnt es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL if AI_no == -1 { break } index = AI_no - ITEM_SPR_HEAD ;キャラ番号をパワーから点数に変える if AI_TUGI <= 1 { AI_HN = CHR_POWER itemtypes(index) = ITEM_POWER } if AI_TUGI >= 2 { AI_HN = CHR_PTS itemtypes(index) = ITEM_PTS } es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo es_apos AI_no, 0,-1 ,100 ;↑に移動 es_type AI_no, BIT_ITEM ;アイテムtype値(8) itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD loop return *当たり判定 repeat ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM if JIKI_VS_TEKI_AI == -1 { break } es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」 index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD if (index >= 0) & (index < ITEM_SPR_NUM) { itemtype = itemtypes(index) // 0 〜 TEKI_MAX-1 でインデックスが得られる tekiindex = itemtekiindices(index) if (itemtype == ITEM_POWER) { AI_HIT++ } if (itemtype == ITEM_PTS) { TN_HIT++ } itemtypes(index) = ITEM_NONE //TEKI_DS_AI_f(tekiindex) = 2 ;アイテムを出すフラグを2にする } loop return

TEKI_DS_AI_f 配列の更新(0→1→2)はオミットしてあります。



アイドル

リンク

2019/8/15(Thu) 23:07:35|NO.88063

砂時 計さんソースありがとうございます!

ちょっと解読にお時間かかります(≡ω≡.) マクロとか使ってないもんで・・・
内容を理解したらお返事しますね〜



アイドル

リンク

2019/8/18(Sun) 16:34:43|NO.88123

理解できました。
すごくスマートなソースでびっくりしています。
過去にやったことが色んなことに応用できそうです。


171:index = AI_no - ITEM_SPR_HEAD
4個づつ配列を作っているんですね。cntだと0からスタートしてしまうため、この方法がいいっていうことがわかりました。


疑問に思ったところがあります。
187:itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
204:tekiindex = itemtekiindices(index)

上記は、「214:TEKI_DS_AI_f(tekiindex) = 2」のために用意した物なのでしょうか。

後、「201:if (index >= 0) & (index < ITEM_SPR_NUM) {」は保険の為に入れてある条件式になるのでしょうか。



砂時 計

リンク

2019/8/19(Mon) 21:06:16|NO.88144

> 187:itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD
> 204:tekiindex = itemtekiindices(index)
>
> 上記は、「214:TEKI_DS_AI_f(tekiindex) = 2」のために用意した物なのでしょうか。

はい。
元の TEKI_DS_AI_f 配列は1アイテムごとの配列で
tekiindex は1敵機ごとの配列と対象が違ったのでコメントアウトしましたが
仮にどのインデックスの敵機から出現したアイテムかを後から
参照したい場合でも参照可能です、という意図です。
アイテム出現時にアイテムの性質(種別)が決まれば十分な場合は
itemtekiindices 配列は不要です。

> 後、「201:if (index >= 0) & (index < ITEM_SPR_NUM) {」は保険の為に入れてある条件式になるのでしょうか。

はい。
当たり判定で存在しない場合は -1 で先にループを抜けています。
当たる対象が常に HEAD 〜 TAIL の範囲内と決まっている場合は不要となります。



アイドル

リンク

2019/8/19(Mon) 23:12:13|NO.88150

砂時 計さんお返事ありがとうございます。

やはりそうだったんですね。これでスッキリしました!
ただ、新しい疑問が出てしまいました・・・orz

>>当たる対象が常に HEAD 〜 TAIL の範囲内と決まっている場合は不要となります。
HEAD 〜 TAILとはどのような物なのでしょうか。検索してもいまいちしっくりこなくって・・・
(初めて聞く単語なのです)


そういえばアイテムの上下を入れてたので、せっかくなので途中から下に移動する処理を入れました
この方法だと・・・連続でアイテムを出すとアウトになるので修正します。
こんなに素敵なヒントが沢山あるんだ出来るはずなんだ!

先に↑↑のお返事を書きたくってレスをしました。
上下はなんとか自力でがんばります。ひぃひぃいったら聞きます。

#include "hspdxfix.as" ;DXライブラリ使用 #const BIT_MYSHOT 2 #const BIT_ITEM 8 #const BIT_TEKI 4096 // アイテム種別 #enum ITEM_NONE = 0 #enum ITEM_POWER #enum ITEM_PTS #enum ITEM_BOMB #enum ITEM_ONEUP // アイテムに割り振るスプライトnoの開始と個数 #const ITEM_SPR_HEAD 150 #const ITEM_SPR_NUM 20 #const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1) #const TEKI_SPR_HEAD 80 #const TEKI_SPR_NUM 5 #const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1) // 自機スプライトno #const MY_SPR 511 // キャラクタno #const CHR_POWER 150 #const CHR_PTS 180 #const CHR_MY 400 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window 30,-30, 412,460 ;スプライト表示エリア設定 es_area 10,-30, 432,480 ;スプライト有効エリア設定 ;---パワーアイテム--- es_size 12,12, 100 es_pat CHR_POWER, 1,80 ;---点アイテム--- es_size 12,20, 100 es_pat CHR_PTS, 14,80 ;---自機--- es_size 28,42, 100 es_pat CHR_MY, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;座標 ;---自機弾--- es_size 11,11, 100 es_pat 51, 1,43 ;---敵--- es_size 50,38, 100 es_pat 70, 19,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;敵アイテム TEKI_AI_MAX = 20 ;アイテムの最大数 dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ // 追加 dim itemtypes, TEKI_AI_MAX dim itemtekiindices, TEKI_AI_MAX foreach itemtekiindices itemtekiindices(cnt) = -1 loop ;---追加--- dim AI_Jc,TEKI_AI_MAX ;上昇カウント ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ TEKI_x = 80,150,220,290,360 TEKI_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls es_draw pos 420,10 : es_mes "AI_HIT " + AI_HIT pos 420,30 : es_mes "TN_HIT " + TN_HIT ;---追加---- pos 370,110 : es_mes "AI_Jc(0) " + AI_Jc(0) pos 370,130 : es_mes "AI_Jc(1) " + AI_Jc(1) pos 370,150 : es_mes "AI_Jc(2) " + AI_Jc(2) pos 370,170 : es_mes "AI_Jc(3) " + AI_Jc(3) pos 510,110 : es_mes "AI_Jc(4) " + AI_Jc(4) pos 510,130 : es_mes "AI_Jc(5) " + AI_Jc(5) pos 510,150 : es_mes "AI_Jc(6) " + AI_Jc(6) pos 510,170 : es_mes "AI_Jc(7) " + AI_Jc(7) pos 370,200 : es_mes "AI_Jc(8) " + AI_Jc(8) pos 370,220 : es_mes "AI_Jc(9) " + AI_Jc(9) pos 370,240 : es_mes "AI_Jc(10) " + AI_Jc(10) pos 370,260 : es_mes "AI_Jc(11) " + AI_Jc(11) pos 510,200 : es_mes "AI_Jc(12) " + AI_Jc(12) pos 510,220 : es_mes "AI_Jc(13) " + AI_Jc(13) pos 510,240 : es_mes "AI_Jc(14) " + AI_Jc(14) pos 510,260 : es_mes "AI_Jc(15) " + AI_Jc(15) ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *当たり判定 es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動 if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動 if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動 if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 JK_TAMA_G_kazu = 0 getkey keyZ,90 ;Zキー if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- 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, BIT_MYSHOT ;type値 } if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする return ;*************敵**************** *敵 repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI, BIT_TEKI } loop ;自機弾VS敵 当たり判定 TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ− AI_KZ = 4 ;◆屮▲ぅ謄狄堯 repeat es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;「敵スプライト80〜84の間を探す」 if TEKI_D == -1 { break } es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;ぁ崚┐自機弾と当たったら変数に not -1を代入」 ;あたったら実行 if TEKI_VS_TAMA != -1 { TKTM_no = TEKI_D gosub *敵アイテム es_kill TEKI_D ;敵「削除」 es_kill TEKI_VS_TAMA ;自弾「削除」 } TEKI_no++ loop ;---追加---- ;アイテム移動処理 AI_no = 150 ;でかい敵アイテムの検索ID if itemtypes(0) = 1 { repeat AI_KZ ;◆屮▲ぅ謄狄堯(4) AI_Jc(cnt) += 1 ;アイテム上昇カウント if AI_Jc(cnt) >= 95 { es_apos AI_no, 0,1 ,100 ;↓に移動 } AI_no++ ;でかい敵アイテムの検索ID loop } return ;************敵アイテム***************** *敵アイテム es_get x,TKTM_no,3 ;スプライトX座標 es_get y,TKTM_no,5 ;スプライトY座標 repeat AI_KZ AI_TUGI = cnt es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL if AI_no == -1 { break } index = AI_no - ITEM_SPR_HEAD ;キャラ番号をパワーから点数に変える if AI_TUGI <= 1 { AI_HN = CHR_POWER itemtypes(index) = ITEM_POWER } if AI_TUGI >= 2 { AI_HN = CHR_PTS itemtypes(index) = ITEM_PTS } es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo es_apos AI_no, 0,-1 ,100 ;↑に移動 es_type AI_no, BIT_ITEM ;アイテムtype値(8) itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD loop return ;*********アイテム当たり判定***************** *当たり判定 repeat ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM if JIKI_VS_TEKI_AI == -1 { break } es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」 index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD if (index >= 0) & (index < ITEM_SPR_NUM) { itemtype = itemtypes(index) // 0 〜 TEKI_MAX-1 でインデックスが得られる tekiindex = itemtekiindices(index) if (itemtype == ITEM_POWER) { AI_HIT++ } if (itemtype == ITEM_PTS) { TN_HIT++ } itemtypes(index) = ITEM_NONE ;---追加---- AI_Jc(index) = 0 ;アイテム上昇カウント【リセット】 //TEKI_DS_AI_f(tekiindex) = 2 ;アイテムを出すフラグを2にする } loop return



砂時 計

リンク

2019/8/20(Tue) 21:58:59|NO.88153

> es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL

これは私の使っている命名規則で
HEAD と TAIL は頭としっぽです。

通常、開始と終了の意味の変数(や引数や定数)は
start, end だったり from, to だったりしますが
APIによってはたまに終了に指定する値を含まなかったりします(HSP3以外を含む)。
※例えば JavaScript の String.substring(indexStart, indexEnd) とか。

es_exnew は es_exnew AI_no, 80, 84 と指定した場合
80〜84の空いているスプライトナンバーが得られる関数であり
84は含まれます。
私はこのような場合の 84 を格納する定数に TAIL という名前をつける習慣にしています。



アイドル

リンク

2019/8/20(Tue) 22:13:20|NO.88156

HEAD と TAILはそういうことだったんですね。
ヘッドとテイルで、頭としっぽ・・!

なるほどそういう名前の付け方もあるんですね。
なにかに収納する機会が増えた結果、変数名に困ることがあったので参考にしてみます。

上下は3日ぐらいしたらリバースしてきます(時間が本当にかかるので先にお返事書きたい勢



アイドル

リンク

2019/8/24(Sat) 19:54:44|NO.88185

やっと時間作れたので、アイテムが上下に移動するソースを作れました。

「流れ」
・アイテムの処理を通過した回数をカウントする(AI_TU_c += 1)
・アイテム通過カウントによって、アイテム動くフラグを立てる(AI_UGO_f(0〜4))
・アイテム動くフラグが立っていたら、アイテム上昇をカウントする
・アイテム上昇が特定の数値になったら、カウント数によって動かすアイテムを決める
・動かすアイテムを下に移動させる

こんな感じに設計したのですが、やはりスマートにできていないです・・・・
なんていうかセンスがない・・orz
すいません。お手数ですがヒントだけでもいいのでアドバイスがほしいです。


#include "hspdxfix.as" ;DXライブラリ使用 #const BIT_MYSHOT 2 #const BIT_ITEM 8 #const BIT_TEKI 4096 // アイテム種別 #enum ITEM_NONE = 0 #enum ITEM_POWER #enum ITEM_PTS #enum ITEM_BOMB #enum ITEM_ONEUP // アイテムに割り振るスプライトnoの開始と個数 #const ITEM_SPR_HEAD 150 #const ITEM_SPR_NUM 20 #const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1) #const TEKI_SPR_HEAD 80 #const TEKI_SPR_NUM 5 #const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1) // 自機スプライトno #const MY_SPR 511 // キャラクタno #const CHR_POWER 150 #const CHR_PTS 180 #const CHR_MY 400 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window 30,-30, 412,460 ;スプライト表示エリア設定 es_area 10,-30, 432,480 ;スプライト有効エリア設定 ;---パワーアイテム--- es_size 12,12, 100 es_pat CHR_POWER, 1,80 ;---点アイテム--- es_size 12,20, 100 es_pat CHR_PTS, 14,80 ;---自機--- es_size 28,42, 100 es_pat CHR_MY, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;座標 ;---自機弾--- es_size 11,11, 100 es_pat 51, 1,43 ;---敵--- es_size 50,38, 100 es_pat 70, 19,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;敵アイテム TEKI_AI_MAX = 20 ;アイテムの最大数 dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ // 追加 dim itemtypes, TEKI_AI_MAX dim itemtekiindices, TEKI_AI_MAX foreach itemtekiindices itemtekiindices(cnt) = -1 loop ;---追加--- dim AI_Jc,TEKI_AI_MAX ;上昇カウント dim AI_UGO_f,TEKI_AI_MAX ;アイテム動くフラグ ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ TEKI_x = 80,150,220,290,360 TEKI_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls es_draw pos 420,10 : es_mes "AI_HIT " + AI_HIT pos 420,30 : es_mes "TN_HIT " + TN_HIT ;---追加---- pos 370,110 : es_mes "AI_Jc(0) " + AI_Jc(0) pos 370,130 : es_mes "AI_Jc(1) " + AI_Jc(1) pos 370,150 : es_mes "AI_Jc(2) " + AI_Jc(2) pos 370,170 : es_mes "AI_Jc(3) " + AI_Jc(3) pos 370,190 : es_mes "AI_Jc(4) " + AI_Jc(4) ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *当たり判定 es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動 if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動 if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動 if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 JK_TAMA_G_kazu = 0 getkey keyZ,90 ;Zキー if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- 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, BIT_MYSHOT ;type値 } if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする return ;*************敵**************** *敵 repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 70 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI, BIT_TEKI } loop ;自機弾VS敵 当たり判定 TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ− AI_KZ = 4 ;◆屮▲ぅ謄狄堯 repeat es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;「敵スプライト80〜84の間を探す」 if TEKI_D == -1 { break } es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;ぁ崚┐自機弾と当たったら変数に not -1を代入」 ;あたったら実行 if TEKI_VS_TAMA != -1 { TKTM_no = TEKI_D gosub *敵アイテム es_kill TEKI_D ;敵「削除」 es_kill TEKI_VS_TAMA ;自弾「削除」 } TEKI_no++ loop ;---追加---- ;アイテム移動処理 if AI_TU_c = 4 : AI_UGO_f(0) = 1 if AI_TU_c = 8 : AI_UGO_f(1) = 1 if AI_TU_c = 12 : AI_UGO_f(2) = 1 if AI_TU_c = 16 : AI_UGO_f(3) = 1 if AI_TU_c = 20 : AI_UGO_f(4) = 1 : AI_TU_c += 1 ;ずっと実行させないために+1する repeat TEKI_MAX ;敵の最大数(5) if AI_UGO_f(cnt) = 1 { ;アイテム動くフラグ AI_Jc(cnt) += 1 ;アイテム上昇カウント if AI_Jc(cnt) >= 95 { AI_UGO_f(cnt) = 0;アイテムを取得したときに、アイテムが再発生してしまうのを防止する if cnt = 0 : AI_no = 150 if cnt = 1 : AI_no = 154 if cnt = 2 : AI_no = 158 if cnt = 3 : AI_no = 162 if cnt = 4 : AI_no = 166 repeat AI_KZ ;◆屮▲ぅ謄狄堯(4) es_apos AI_no, 0,1 ,100 ;↓に移動 AI_no++ loop } } loop return ;************敵アイテム***************** *敵アイテム es_get x,TKTM_no,3 ;スプライトX座標 es_get y,TKTM_no,5 ;スプライトY座標 repeat AI_KZ AI_TUGI = cnt es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL if AI_no == -1 { break } index = AI_no - ITEM_SPR_HEAD ;---追加---- AI_TU_c += 1 ;通った回数をカウントする ;キャラ番号をパワーから点数に変える if AI_TUGI <= 1 { AI_HN = CHR_POWER itemtypes(index) = ITEM_POWER } if AI_TUGI >= 2 { AI_HN = CHR_PTS itemtypes(index) = ITEM_PTS } es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo es_apos AI_no, 0,-1 ,100 ;↑に移動 es_type AI_no, BIT_ITEM ;アイテムtype値(8) itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD loop return ;*********アイテム当たり判定***************** *当たり判定 repeat ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM if JIKI_VS_TEKI_AI == -1 { break } es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」 index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD if (index >= 0) & (index < ITEM_SPR_NUM) { itemtype = itemtypes(index) // 0 〜 TEKI_MAX-1 でインデックスが得られる tekiindex = itemtekiindices(index) if (itemtype == ITEM_POWER) { AI_HIT++ } if (itemtype == ITEM_PTS) { TN_HIT++ } itemtypes(index) = ITEM_NONE ;---追加---- AI_Jc(index) = 0 ;アイテム上昇カウント【リセット】 } loop return



砂時 計

リンク

2019/8/26(Mon) 22:00:27|NO.88213

アイテムが落下に転じるフレームカウンタ数を
アイテムごとに保持する方法でやってみました。

item_turns, frame_counter あたりを見てみてください。


#include "hspdxfix.as" ;DXライブラリ使用 #const BIT_MYSHOT 2 #const BIT_ITEM 8 #const BIT_TEKI 4096 // アイテム種別 #enum ITEM_NONE = 0 #enum ITEM_POWER #enum ITEM_PTS #enum ITEM_BOMB #enum ITEM_ONEUP // アイテムに割り振るスプライトnoの開始と個数 #const ITEM_SPR_HEAD 150 #const ITEM_SPR_NUM 20 #const ITEM_SPR_TAIL (ITEM_SPR_HEAD+ITEM_SPR_NUM-1) #const TEKI_SPR_HEAD 80 #const TEKI_SPR_NUM 5 #const TEKI_SPR_TAIL (TEKI_SPR_HEAD+TEKI_SPR_NUM-1) // 自機スプライトno #const MY_SPR 511 // キャラクタno #const CHR_MYSHOT 51 #const CHR_TEKI 70 #const CHR_POWER 150 #const CHR_PTS 180 #const CHR_MY 400 // アイテムが出現してから何フレームで下へターンするか #const TURN_FRAME 95 width ,,130,200 ;ウィンドウの位置 es_ini 640,5000,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window 30,-30, 412,460 ;スプライト表示エリア設定 es_area 10,-30, 432,480 ;スプライト有効エリア設定 ;---パワーアイテム--- es_size 12,12, 100 es_pat CHR_POWER, 1,80 ;---点アイテム--- es_size 12,20, 100 es_pat CHR_PTS, 14,80 ;---自機--- es_size 28,42, 100 es_pat CHR_MY, 0, 0 JIKI_x = 206 : JIKI_y = 390 ;座標 ;---自機弾--- es_size 11,11, 100 es_pat CHR_MYSHOT, 1,43 ;---敵--- es_size 50,38, 100 es_pat CHR_TEKI, 19,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX dim TEKI_x,TEKI_MAX dim TEKI_y,TEKI_MAX ;敵アイテム TEKI_AI_MAX = 20 ;アイテムの最大数 dim TEKI_DS_AI_f,TEKI_AI_MAX ;アイテムを出すフラグ // 追加 dim itemtypes, TEKI_AI_MAX dim itemtekiindices, TEKI_AI_MAX foreach itemtekiindices itemtekiindices(cnt) = -1 loop ;---追加--- dim AI_Jc,TEKI_AI_MAX ;上昇カウント dim AI_UGO_f,TEKI_AI_MAX ;アイテム動くフラグ // 追加 dim item_turns, TEKI_AI_MAX ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ TEKI_x = 80,150,220,290,360 TEKI_y = 300,300,300,300,300 // フレームごとに増えていく全体カウンタ frame_counter = -1 ;************メインループ*************** *メイン frame_counter += 1 es_cls es_draw pos 420,10 : es_mes "AI_HIT " + AI_HIT pos 420,30 : es_mes "TN_HIT " + TN_HIT ;---追加---- pos 370,110 : es_mes "AI_Jc(0) " + AI_Jc(0) pos 370,130 : es_mes "AI_Jc(1) " + AI_Jc(1) pos 370,150 : es_mes "AI_Jc(2) " + AI_Jc(2) pos 370,170 : es_mes "AI_Jc(3) " + AI_Jc(3) pos 370,190 : es_mes "AI_Jc(4) " + AI_Jc(4) ;*************カウンター**************** gosub *自機の移動 gosub *自機弾移動 gosub *敵 gosub *当たり判定 gosub *アイテムターン es_set MY_SPR, JIKI_x,JIKI_y, CHR_MY ;自機表示 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - 4 ;←の移動 if key & 2 : JIKI_y = JIKI_y - 4 ;↑の移動 if key & 4 : JIKI_x = JIKI_x + 4 ;→の移動 if key & 8 : JIKI_y = JIKI_y + 4 ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 JK_TAMA_G_kazu = 0 getkey keyZ,90 ;Zキー if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- 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, CHR_MYSHOT ;スプライトNo, X,Y座標 ,キャラNo es_apos JK_TAMA, 0,-15 ,100 ;↑に移動 RENSA = 2 ;弾の間隔 es_type JK_TAMA, BIT_MYSHOT ;type値 } if RENSA > 0 : RENSA -= 1 ;弾の間隔をリセットする return ;*************敵**************** *敵 repeat TEKI_MAX ;敵の最大数(5) if TEKI_f(cnt) = 0 { TEKI_f(cnt) = 1 es_exnew TEKI, TEKI_SPR_HEAD, TEKI_SPR_TAIL ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), CHR_TEKI ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI, BIT_TEKI } loop ;自機弾VS敵 当たり判定 TEKI_no = TEKI_SPR_HEAD ;敵の検索開始ナンバ− AI_KZ = 4 ;◆屮▲ぅ謄狄堯 repeat es_find TEKI_D, BIT_TEKI, TEKI_no, TEKI_SPR_TAIL ;「敵スプライト80〜84の間を探す」 if TEKI_D == -1 { break } es_check TEKI_VS_TAMA ,TEKI_D, BIT_MYSHOT ;ぁ崚┐自機弾と当たったら変数に not -1を代入」 ;あたったら実行 if TEKI_VS_TAMA != -1 { TKTM_no = TEKI_D gosub *敵アイテム es_kill TEKI_D ;敵「削除」 es_kill TEKI_VS_TAMA ;自弾「削除」 } TEKI_no++ loop ;---追加---- ;アイテム移動処理 /* if AI_TU_c = 4 : AI_UGO_f(0) = 1 if AI_TU_c = 8 : AI_UGO_f(1) = 1 if AI_TU_c = 12 : AI_UGO_f(2) = 1 if AI_TU_c = 16 : AI_UGO_f(3) = 1 if AI_TU_c = 20 : AI_UGO_f(4) = 1 : AI_TU_c += 1 ;ずっと実行させないために+1する repeat TEKI_MAX ;敵の最大数(5) if AI_UGO_f(cnt) = 1 { ;アイテム動くフラグ AI_Jc(cnt) += 1 ;アイテム上昇カウント if AI_Jc(cnt) >= 95 { AI_UGO_f(cnt) = 0;アイテムを取得したときに、アイテムが再発生してしまうのを防止する if cnt = 0 : AI_no = 150 if cnt = 1 : AI_no = 154 if cnt = 2 : AI_no = 158 if cnt = 3 : AI_no = 162 if cnt = 4 : AI_no = 166 repeat AI_KZ ;◆屮▲ぅ謄狄堯(4) es_apos AI_no, 0,1 ,100 ;↓に移動 AI_no++ loop } } loop */ return ;************敵アイテム***************** *敵アイテム es_get x,TKTM_no,3 ;スプライトX座標 es_get y,TKTM_no,5 ;スプライトY座標 repeat AI_KZ AI_TUGI = cnt es_exnew AI_no, ITEM_SPR_HEAD, ITEM_SPR_TAIL if AI_no == -1 { break } index = AI_no - ITEM_SPR_HEAD ;---追加---- AI_TU_c += 1 ;通った回数をカウントする ;キャラ番号をパワーから点数に変える if AI_TUGI <= 1 { AI_HN = CHR_POWER itemtypes(index) = ITEM_POWER } if AI_TUGI >= 2 { AI_HN = CHR_PTS itemtypes(index) = ITEM_PTS } es_set AI_no, x + AI_TUGI*15, y, AI_HN ;スプライトNo, X,Y座標 ,キャラNo es_apos AI_no, 0,-1 ,100 ;↑に移動 es_type AI_no, BIT_ITEM ;アイテムtype値(8) item_turns(index) = frame_counter + TURN_FRAME itemtekiindices(index) = TKTM_no - TEKI_SPR_HEAD loop return ;*********アイテム当たり判定***************** *当たり判定 repeat ; 400(自機),8(アイテム) es_check JIKI_VS_TEKI_AI, MY_SPR, BIT_ITEM if JIKI_VS_TEKI_AI == -1 { break } es_kill JIKI_VS_TEKI_AI ;敵アイテム「削除」 index = JIKI_VS_TEKI_AI - ITEM_SPR_HEAD if (index >= 0) & (index < ITEM_SPR_NUM) { itemtype = itemtypes(index) // 0 〜 TEKI_MAX-1 でインデックスが得られる tekiindex = itemtekiindices(index) if (itemtype == ITEM_POWER) { AI_HIT++ } if (itemtype == ITEM_PTS) { TN_HIT++ } itemtypes(index) = ITEM_NONE ;---追加---- //AI_Jc(index) = 0 ;アイテム上昇カウント【リセット】 } loop return ;*********アイテムターン判定***************** *アイテムターン cur = ITEM_SPR_HEAD repeat es_find found, BIT_ITEM, cur, ITEM_SPR_TAIL if found == -1 { break } index = found - ITEM_SPR_HEAD if (index >= 0) & (index < ITEM_SPR_NUM) { if frame_counter == item_turns(index) { es_apos found, 0,1 ,100 ;↓に移動 } } // 次を探しにいく。裏返ったら break しないと無限ループ cur = found + 1 if cur > ITEM_SPR_TAIL { break } loop return



アイドル

リンク

2019/8/28(Wed) 21:24:41|NO.88242

砂時 計さん、ソースと回答ありがとうございます!!

なるほど、フレーム数をカウントしてその数値を代入していって、
「フレーム+移動するまでの時間」を代入すれば、
条件式で「フレーム = 代入されている数」を行うことによって、
時間が経過したら移動を行っているんですね。

こういう考え方は私だと絶対思い浮かばなかったので助かりました!!
フレーム数が無限に増加するとちょっと怖いので、本番ソースではストッパーを入れようと思います。
(スプライト前の設計は決まっていますが、スプライトではどうするか・・・)


ほんとうにありがとうございます。解決です〜♪



記事削除

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

NO.88021への返信

マスコット

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

名前

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

削除用パスワード

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

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

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