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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0811
アイドル【hspdxfix.as】敵の配列0から撃破すると、次の敵に撃破した敵分の弾が実行される6解決


アイドル

リンク

2020/8/11(Tue) 23:21:00|NO.91152

どうもなのです。
いつもどおりhspdxfix.asプラグインで作ったSTGゲームです。


敵の配列を0から撃破すると、次の敵に存在してた敵分の弾が実行されてしまい困ってます。


一番左にいる敵を倒すと、TEKI_TM_f(0)に「1」が立っているので、
次の敵が1発なところ2発打っている状況になってしまいます・・
分かりづらい場合は一番右側の敵を残すとわかりやすいかも。

「考察」
枠外に行ったら弾フラグを「0」にするので、それのせいで再実行されているから、
敵を撃破したときに弾フラグを「2」にして、枠外実行を弾フラグ「1以下」のときに実行とかやってみたのですが、
この方法でもうまくいかず・・・


最大の配列数から撃破すると発生しないとで、何かやらかしていると思います。
自力で解決できると思ったんですが、久し振りのせいか全然ダメダメなので質問しました・・・orz

 ■仕様■
1.敵1匹に対する弾数は1個
2.敵を撃破したら、その敵の弾を実行しない


#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 -43,-68, 440,498 ;スプライト有効エリア設定 ;---自機--- es_size 28,42, 100 es_pat 350, 0, 0 JIKI_x = 80 : JIKI_y = 400 TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;---自機弾--- es_size 11,11, 150 es_pat 51, 1,43 ;---敵--- es_size 50,50, 100 es_pat 320, 19,0 ;---敵弾--- es_size 34,34, 25 es_pat 75, 125,0 ;敵配置 TEKI_MAX = 5 ;敵の最大数 dim TEKI_f,TEKI_MAX ;フラグ ;弾敵弾 dim TEKI_TM_f,TEKI_MAX ;フラグ ;▼▼▼▼▼敵配列▼▼▼▼▼ TEKI_x = 100,150,200,250,300 TEKI_y = 350,280,210,140,70 ;■■■敵配置■■■ repeat TEKI_MAX ;敵の最大数(5) es_exnew TEKI, 320,324 ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 320 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 loop ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 480,20 : es_mes "TEKI_TM_f(0) " + TEKI_TM_f(0) pos 480,40 : es_mes "TEKI_TM_f(1) " + TEKI_TM_f(1) pos 480,60 : es_mes "TEKI_TM_f(2) " + TEKI_TM_f(2) pos 480,80 : es_mes "TEKI_TM_f(3) " + TEKI_TM_f(3) pos 480,100 : es_mes "TEKI_TM_f(4) " + TEKI_TM_f(4) ;*****************ゲーム枠外*************** es_set 350, JIKI_x,JIKI_y, 350 ;自機 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_set 70, TE_x,TE_y, 70 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード(2) } else { JIKISpd = 4 ;自機のスピード(4) } ;************gosub************ gosub *自機の移動 gosub *自機弾移動 gosub *敵弾移動 es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動************* *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - JIKISpd ;←の移動 if key & 2 : JIKI_y = JIKI_y - JIKISpd ;↑の移動 if key & 4 : JIKI_x = JIKI_x + JIKISpd ;→の移動 if key & 8 : JIKI_y = JIKI_y + JIKISpd ;↓の移動 return ;*************自機弾移動**************** *自機弾移動 getkey keyZ,90 ;Zキー JK_TAMA_G_kazu = 0 if keyZ AND JKSO_f = 0 AND RENSA = 0 { es_exnew JK_TAMA ,10,30 ;新規スプライト取得 ;---弾の判断--- if JK_TAMA_c >= 1 { JK_TAMA_dai_Kz = JK_TAMA_c \ 2 if JK_TAMA_dai_Kz = 0 : JK_TAMA_G_kazu += 1 } JK_TAMA_c++ ;ループ内カウンター if JK_TAMA_G_kazu = 0 : JKSO_x = JIKI_x-6 ;左側 if JK_TAMA_G_kazu = 1 : JKSO_x = JIKI_x+18 ;右側 JKSO_y = JIKI_y es_set JK_TAMA, JKSO_x,JKSO_y, 51 ;スプライトNo, X,Y座標 ,キャラNo es_apos JK_TAMA, 0,-15 ,100 ;↑に移動 RENSA = 2 ;弾の間隔 es_type JK_TAMA,2 ;自機弾type値(2) } if RENSA > 0 : RENSA -= 1 ;弾の間隔 return ;*************敵弾移動**************** *敵弾移動 ;当たり判定 TEKI_no = 320 ;敵のスプライト検索開始ナンバー repeat TEKI_MAX ;敵の最大数(5) es_check TEKI_VS_TAMA ,TEKI_no,2 if TEKI_VS_TAMA != -1 & TEKI_f(cnt) = 0 { TEKI_SP_D = TEKI_no - 320 TEKI_f(TEKI_SP_D) = 1 ;敵フラグを「立てる」 es_kill TEKI_no ;敵「削除」 es_kill TEKI_VS_TAMA;自機弾「削除」 }TEKI_no++ ;敵のスプライト検索開始ナンバー loop ;敵弾 TEKI_no = 320 ;敵のスプライト検索開始ナンバー repeat es_find TEKI, 4096, TEKI_no,324, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break if TEKI_TM_f(TEKI-320) = 0 { ;敵弾フラグが立ってないときに実行 es_exnew TEKI_TM, 340,350 ;新規スプライト取得 TEKI_TM_f(TEKI_TM-340) = 1 ;敵弾フラグを【立てる】 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,75 ;スプライト設定 es_adir TEKI_TM, TEKI_TM_ang,300 ;スプライト移動方向設定 es_type TEKI_TM,32 }TEKI_no++ ;敵弾のスプライト検索開始ナンバー loop ;---画面外判定--- TEKI_TM_no = 340 ;敵弾のスプライト検索開始ナンバー repeat es_find TEKI_TM, 32, TEKI_TM_no,350, 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 < -58) or (TEKI_TM_x > 435) or (TEKI_TM_y > 488) { TEKI_TM_f(TEKI_TM-340) = 0;敵弾フラグ【初期化】 es_kill TEKI_TM ;敵弾【削除】 }TEKI_TM_no++ ;敵弾のスプライト検索開始ナンバー loop return



この記事に返信する


あらや

リンク

2020/8/12(Wed) 04:38:46|NO.91153

ざっくりと抜粋させていただきますが

下記の箇所

;敵弾 TEKI_no = 320 ;敵のスプライト検索開始ナンバー repeat es_find TEKI, 4096, TEKI_no,324, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 if TEKI < 0 : break if TEKI_TM_f(TEKI-320) = 0 { ;敵弾フラグが立ってないときに実行 es_exnew TEKI_TM, 340,350 ;新規スプライト取得 TEKI_TM_f(TEKI_TM-340) = 1 ;敵弾フラグを【立てる】

>if TEKI_TM_f(TEKI-320) = 0 { ;敵弾フラグが立ってないときに実行
このフラグと
>TEKI_TM_f(TEKI_TM-340) = 1 ;敵弾フラグを【立てる】
このフラグ

もっと具体的に言うと『TEKI-320』と『TEKI_TM-340』は
別の数値になるのはわかるでしょうか?

抜粋した箇所のソースだけでもたどってみるとわかると思いますが
両方とも『TEKI-320』にすれば修正できるかと。



アイドル

リンク

2020/8/12(Wed) 11:52:08|NO.91154

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

ぎじゃああああああああああああ
TEKI-320って唱えているのにTEKI_TM-340で処理するボンミス・・

修正したところ、敵を倒して数秒後一番左の敵からしか弾を出さないという不具合がおきました
原因はなんとなく思い当たる節があるのでがんばって直してみます。
ありがとうございます!



アイドル

リンク

2020/8/13(Thu) 13:18:29|NO.91156

再度調査して色々試してみたんですが、どれもうまくいかず・・・
イメージ通りのせっていだと思うんだけど、どこがいけないのかいまいちわからず。
再度アドバイスでももらえたら幸いです



あらや

リンク

2020/8/13(Thu) 17:07:00|NO.91158

すみません見逃していました。

同じ抜粋箇所で
新規で敵弾を作成するときに『es_exnew』を使用しているので、

敵2(真ん中の敵 スプライト:322)だけを倒した時

敵0、1はそれぞれスプライト320、321で弾のスプライトは340、341になりますが
敵3、4はスプライト323、324で弾のスプライトは342、343

というように敵と敵弾の番号がズレてしまい
そのズレが画面外判定の
>TEKI_TM_f(TEKI_TM-340) = 0;敵弾フラグ【初期化】
>es_kill TEKI_TM ;敵弾【削除】
この削除処理に影響するようです。

例:3の敵弾を削除するときに、
2の敵弾フラグを0にして342のスプライトを削除してしまう

という具合になります。

対処法として簡単なのは
『es_exnew』ではなく

;es_exnew TEKI_TM, 340,350 ;新規スプライト取得 TEKI_TM = TEKI+20; // TEKI - 320 + 340
このように必ず敵と敵弾のスプライト番号が20差になるように
計算で番号を決定する事でしょうか。



アイドル

リンク

2020/8/13(Thu) 20:18:50|NO.91159

あらやさん、再度返答ありがとうございます!
いえいえ、私が無駄に自己解決しようとしてたせいですので、お気になさらず。

es_exnewのせいで空きのあるスプライトの番号が入ってしまうのが原因で、
敵を倒したときにずれが起きてしまうんですね!
今までこの作り方だったのでかなりショックです・・・

分解したときはうまくいったのに、ループでくっつけるとうまくいかない原因に納得ですわ。


リピート入る前に「TEKI_TM = 340」みたいに宣言して、
ループ直前で「TEKI_TM」を増加する方法でもできそうですが、
TEKI_TM = TEKI+20のほうが簡単だし1行でできるのでよさそうです!

メインソースやら色々触ってくるので、大丈夫になったら解決に入れときます!
ありがとうございます



アイドル

リンク

2020/8/15(Sat) 09:36:54|NO.91170

本ソースに入れても問題ないことを確認したので解決にチェックいれます
なんか起きてわからなくなったらまた聞くと思います・・・



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