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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0608
アイドル【hspdxfix.as】敵弾にくっついている物体の判定を1回だけにしたい5解決


アイドル

リンク

2019/6/8(Sat) 13:57:27|NO.87560

どうもアイドルです。

今回のものは頑張れば自己解決できそうな気もしますが、
なんとか今年中に軽量化を完成させたいので質問しちゃいます。

 ■仕様■
・でっかい四角やつがグレイズです(下に小さい四角が敵弾です)
・敵弾は動いている
・敵弾が画面外に行ったら初期の位置に戻る(再発射)
・敵弾にくっついている物体(以下、グレイズ)は敵弾と同じ動きをする
・グレイズは触れると点数が増加する(ミニソースなのでカウントだけ)
・グレイズは敵弾が画面内にある限り、1弾につき1回しか発生しない
・敵弾が画面外に行って、敵弾が再発射されたらグレイズが復活する

 ■困っているところ■
例えば敵弾(0)のグレイズと当たった時、グレイズを1回しか判定させたくないのですが、
現状のソースだと何回も当たってしまいます。

フラグで制御してしまうと、グレイズが動かなくなってしまいます(98行)
何故動かなくなるかと言うと、敵弾の座標を参照してグレイズが動く設計にしているからです。

なのでフラグではない別の方法でどうにかするしかないと思いますが、
また何か勿体ない見落としをしていると思います。


「es_kill 変数名」「if 変数名 != -1」でスプライトを判定できているので、(118、119行)
これの応用で行けると思うんです・・・思うんです・・・
そのあがきが109行〜114行です。スプライトを判断して管理すればいけるだろうとかそんな感じです。

ちょっと厄介かもしれませんが、ほんの少しのアドバイスでもひらめくかもしれないので、よろしくお願いします。

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 500,500,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 = 220 : JIKI_y = 313 ;自機の座標 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,4 ;---敵弾--- es_size 17,17, 50 es_pat 85, 70,0 ;敵弾 TAMA_MAX = 5 dim TEKI_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX ;グレイズ dim GURE_f,TAMA_MAX dim GURE_HIT_f,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TAMA_x = 50,120,190,260,330 TAMA_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,110 : es_mes "hit " + hit pos 400,130 : es_mes "GURE_hit " + GURE_hit pos 400,160 : es_mes "HIT_GURE " + HIT_GURE pos 400,190 : es_mes "GURE_HIT_f(0) " + GURE_HIT_f(0) pos 400,210 : es_mes "GURE_HIT_f(1) " + GURE_HIT_f(1) pos 400,230 : es_mes "GURE_HIT_f(2) " + GURE_HIT_f(2) pos 400,250 : es_mes "GURE_HIT_f(3) " + GURE_HIT_f(3) pos 400,270 : es_mes "GURE_HIT_f(4) " + GURE_HIT_f(4) ;*************カウンター************** gosub *自機の移動 gosub *敵弾移動 gosub *グレイズ ;自機 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 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード } else { 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 ;**************敵弾移動*************** *敵弾移動 repeat 5 es_exnew TEKI_TM ,80,84 ;新規スプライトNo (80〜84) es_set TEKI_TM, TAMA_x(cnt),TAMA_y(cnt), 85 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,5 ,30 ;↓に移動 es_type TEKI_TM,32 loop ;当たり判定 ; 195(低速移動),32(敵弾) es_check TEISK_VS_TEKI ,195,32 if TEISK_VS_TEKI != -1 { ;敵弾と当たったら実行 es_kill TEISK_VS_TEKI ;敵弾削除 hit += 1 ;ヒット数(デバッグ用) } return ;*************グレイズ**************** *グレイズ TKTM_no = 80 ;敵弾の場所検索ID GURE_no = 410 ;グレイズの場所検索ID repeat 5 ; if GURE_f(cnt) = 0 { ;敵弾の座標を参照しているので、フラグを立てると、グレイズが動かなくなる ; GURE_f(cnt) = 1 es_get GURE_x(cnt),TKTM_no,3 ;スプライトのX座標 es_get GURE_y(cnt),TKTM_no,5 ;スプライトのY座標 es_set GURE_no, GURE_x(cnt)-21,GURE_y(cnt)-51, 410 ;(Yの本来の値は-21) es_type GURE_no,128 ;グレイズtype値(64) TKTM_no++ ;敵弾の場所検索ID GURE_no++ ;グレイズの場所検索ID ; } loop ;スプライトの値が入ったら制御すればいけそう? if HIT_GURE = 410 : GURE_HIT_f(0) = 1 if HIT_GURE = 411 : GURE_HIT_f(1) = 1 if HIT_GURE = 412 : GURE_HIT_f(2) = 1 if HIT_GURE = 413 : GURE_HIT_f(3) = 1 if HIT_GURE = 414 : GURE_HIT_f(4) = 1 ;当たり判定 ; 400(自機),128(グレイズ) es_check JK_VS_GURE ,400,128 if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;スプライト削除(グレイズ) GURE_hit++ ;ヒット数(デバッグ用) HIT_GURE = JK_VS_GURE ;代入すればいけるかも?(410〜414) } return



この記事に返信する


Ponyo

リンク

2019/6/8(Sat) 15:30:59|NO.87561

getkeyで例えるのが一番だったのでご参考にどうぞ(*'▽')

変数名 = 0 _変数名 = 変数名 repeat getkey 変数名, 32 if ( ( 変数名 == 1 ) & ( _変数名 == 0 ) ) { mes "一回だけ" } _変数名 = 変数名 await 16 loop
これをあたり判定対応に改変すれば簡単にできます。



アイドル

リンク

2019/6/8(Sat) 22:31:55|NO.87568

Ponyoさん回答ありがとうございます!

確かにその方法なら1回しか判定されなくなるんですが、
「グレイズは敵弾が画面内にある限り、1弾につき1回しか発生しない」を満たすことはもうちょっと条件が必要かもです。
この1弾につき1回というのは、ソースで言えば5個分発生させたいんですよね。

ソースを分解・・・「GURE_x(0)、GURE_x(1)、GURE_x(2)、GURE_x(3)、GURE_x(4)」
例えばGURE_x(0)とぶつかっても、GURE_x(0)以外とぶつかることができるようにしたいのです。


repeatすればいいんじゃねーって感じはしますが、
es_checkはスプライトとtype値を探しているだけなので、
repeatしてもスプライトそのものを判定しないとダメなのです(´・ω・`)

多分ヒントから改造すれば出来るとは思うのですが・・なんか沸かない・・・


 ■変更点■
・GURE_hit_fを加えて、グレイズとぶつかった時、そのグレイズは1回しか判定しないようにしました。
・グレイズとぶつかったフラグを初期化するために、一番下まで行ったらフラグを初期化するようにした。


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 500,500,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 = 220 : JIKI_y = 313 ;自機の座標 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,4 ;---敵弾--- es_size 17,17, 50 es_pat 85, 70,0 ;敵弾 TAMA_MAX = 5 dim TEKI_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX ;グレイズ dim GURE_f,TAMA_MAX dim GURE_HIT_f,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TAMA_x = 50,120,190,260,330 TAMA_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,110 : es_mes "hit " + hit pos 400,130 : es_mes "GURE_hit " + GURE_hit pos 400,150 : es_mes "test " + test pos 400,190 : es_mes "GURE_HIT_f(0) " + GURE_HIT_f(0) pos 400,210 : es_mes "GURE_HIT_f(1) " + GURE_HIT_f(1) pos 400,230 : es_mes "GURE_HIT_f(2) " + GURE_HIT_f(2) pos 400,250 : es_mes "GURE_HIT_f(3) " + GURE_HIT_f(3) pos 400,270 : es_mes "GURE_HIT_f(4) " + GURE_HIT_f(4) pos 400,300 : es_mes "GURE_hit_f " + GURE_hit_f ;*************カウンター************** gosub *自機の移動 gosub *敵弾移動 gosub *グレイズ ;自機 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 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード } else { 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 ;**************敵弾移動*************** *敵弾移動 repeat 5 es_exnew TEKI_TM ,80,84 ;新規スプライトNo (80〜84) es_set TEKI_TM, TAMA_x(cnt),TAMA_y(cnt), 85 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,5 ,30 ;↓に移動 es_type TEKI_TM,32 loop ;当たり判定 ; 195(低速移動),32(敵弾) es_check TEISK_VS_TEKI ,195,32 if TEISK_VS_TEKI != -1 { ;敵弾と当たったら実行 es_kill TEISK_VS_TEKI ;敵弾削除 hit += 1 ;ヒット数(デバッグ用) } ;一番下まで行ったら【実行】 es_get TEKI_TM_Di_y,80,5 ;弾Y repeat 5 if TEKI_TM_Di_y >= 480 : GURE_hit_f = 0 ;グレイズとぶつかったフラグ【初期化】 loop return ;*************グレイズ**************** *グレイズ TKTM_no = 80 ;敵弾の場所検索ID GURE_no = 410 ;グレイズの場所検索ID repeat 5 es_get GURE_x(cnt),TKTM_no,3 ;スプライトのX座標 es_get GURE_y(cnt),TKTM_no,5 ;スプライトのY座標 es_set GURE_no, GURE_x(cnt)-21,GURE_y(cnt)-51, 410 ;(Yの本来の値は-21) es_type GURE_no,128 ;グレイズtype値(64) TKTM_no++ ;敵弾の場所検索ID GURE_no++ ;グレイズの場所検索ID loop ;当たり判定 ; 400(自機),128(グレイズ) if GURE_hit_f = 0 { es_check JK_VS_GURE ,400,128 if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;スプライト削除(グレイズ) GURE_hit++ ;ヒット数(デバッグ用) GURE_hit_f = 1 ;グレイズとぶつかったフラグ【立てる】 } } return



アイドル

リンク

2019/6/9(Sun) 16:57:17|NO.87576

なんか自己解決しちゃいました。

 ■変更点■
・グレイズと当たっているときに、スプライトの開始地点を宣言する
・グレイズのある数までリピートする
・ぶつかったスプレイト数と、スプライト数が一致したらフラグを立てる
・弾が一番下まで行ったらグレイズヒットフラグを初期化する

一致したスプライトのみフラグを立てることによって、
同じスプライトのグレイズは1回しか判定しなくなります。
そして、フラグを作ったので、弾が画面外に行ったら初期化すればおkって感じにできました!
ありがとうございます!!

(ソースはわかりやすくするために、グレイズを-51の座標にしている関係で、
一番下の方でグレイズを発生させると、再生産した瞬間にグレイズとぶつかってしまいますが、
座標は-21なのと、実際のゲームではここまで下に下がれる仕様ではないので問題ありません)


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 500,500,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 = 220 : JIKI_y = 313 ;自機の座標 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,4 ;---敵弾--- es_size 17,17, 50 es_pat 85, 70,0 ;敵弾 TAMA_MAX = 5 dim TEKI_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX ;グレイズ dim GURE_f,TAMA_MAX dim GURE_HIT_f,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TAMA_x = 50,120,190,260,330 TAMA_y = 300,300,300,300,300 ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,110 : es_mes "hit " + hit pos 400,130 : es_mes "GURE_hit " + GURE_hit pos 400,160 : es_mes "HIT_GURE " + HIT_GURE pos 400,190 : es_mes "GURE_HIT_f(0) " + GURE_HIT_f(0) pos 400,210 : es_mes "GURE_HIT_f(1) " + GURE_HIT_f(1) pos 400,230 : es_mes "GURE_HIT_f(2) " + GURE_HIT_f(2) pos 400,250 : es_mes "GURE_HIT_f(3) " + GURE_HIT_f(3) pos 400,270 : es_mes "GURE_HIT_f(4) " + GURE_HIT_f(4) ;*************カウンター************** gosub *自機の移動 gosub *敵弾移動 gosub *グレイズ ;自機 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 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード } else { 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 ;**************敵弾移動*************** *敵弾移動 repeat 5 es_exnew TEKI_TM ,80,84 ;新規スプライトNo (80〜84) es_set TEKI_TM, TAMA_x(cnt),TAMA_y(cnt), 85 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,5 ,30 ;↓に移動 es_type TEKI_TM,32 loop ;当たり判定 ; 195(低速移動),32(敵弾) es_check TEISK_VS_TEKI ,195,32 if TEISK_VS_TEKI != -1 { ;敵弾と当たったら実行 es_kill TEISK_VS_TEKI ;敵弾削除 hit += 1 ;ヒット数(デバッグ用) } ;一番下まで行ったら【実行】 es_get TEKI_TM_Di_y,80,5 ;弾Y repeat 5 if TEKI_TM_Di_y >= 480 { GURE_HIT_f(cnt) = 0 ;グレイズヒットフラグ【初期化】 } loop return ;*************グレイズ**************** *グレイズ TKTM_no = 80 ;敵弾の場所検索ID GURE_no = 410 ;グレイズの場所検索ID repeat 5 if GURE_HIT_f(cnt) = 0 { ;グレイズヒットフラグ es_get GURE_x(cnt),TKTM_no,3 ;スプライトのX座標 es_get GURE_y(cnt),TKTM_no,5 ;スプライトのY座標 es_set GURE_no, GURE_x(cnt)-21,GURE_y(cnt)-51, 410 ;(Yの本来の値は-21) es_type GURE_no,128 ;グレイズtype値(64) } TKTM_no++ ;敵弾の場所検索ID GURE_no++ ;グレイズの場所検索ID loop ;当たり判定 ; 400(自機),128(グレイズ) es_check JK_VS_GURE ,400,128 if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;スプライト削除(グレイズ) GURE_hit++ ;ヒット数(デバッグ用) ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズの場所検索ID repeat 5 if JK_VS_GURE = GURE_no : GURE_HIT_f(cnt) = 1 GURE_no++ ;グレイズの場所検索ID loop } return



アイドル

リンク

2019/6/9(Sun) 17:33:07|NO.87577

すいません。
弾を縦に配置するとグレイズが何回もぶつかってしまう不具合が出てしまいました。
なので真似しようと思っている人は↑のソースは参考にしないでください!

原因がわかったら追記します・・・トホホ・・・・・

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 500,500,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 = 220 : JIKI_y = 313 ;自機の座標 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,4 ;---敵弾--- es_size 17,17, 50 es_pat 85, 70,0 ;敵弾 TAMA_MAX = 5 dim TEKI_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX ;グレイズ dim GURE_f,TAMA_MAX dim GURE_HIT_f,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ TAMA_x = 200,200,200,200,200 TAMA_y = 300,250,200,150,100 ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,110 : es_mes "hit " + hit pos 400,130 : es_mes "GURE_hit " + GURE_hit pos 400,160 : es_mes "HIT_GURE " + HIT_GURE pos 400,190 : es_mes "GURE_HIT_f(0) " + GURE_HIT_f(0) pos 400,210 : es_mes "GURE_HIT_f(1) " + GURE_HIT_f(1) pos 400,230 : es_mes "GURE_HIT_f(2) " + GURE_HIT_f(2) pos 400,250 : es_mes "GURE_HIT_f(3) " + GURE_HIT_f(3) pos 400,270 : es_mes "GURE_HIT_f(4) " + GURE_HIT_f(4) ;*************カウンター************** gosub *自機の移動 gosub *敵弾移動 gosub *グレイズ ;自機 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 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード } else { 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 ;**************敵弾移動*************** *敵弾移動 repeat 5 es_exnew TEKI_TM ,80,84 ;新規スプライトNo (80〜84) es_set TEKI_TM, TAMA_x(cnt),TAMA_y(cnt), 85 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,5 ,30 ;↓に移動 es_type TEKI_TM,32 loop ;当たり判定 ; 195(低速移動),32(敵弾) es_check TEISK_VS_TEKI ,195,32 if TEISK_VS_TEKI != -1 { ;敵弾と当たったら実行 es_kill TEISK_VS_TEKI ;敵弾削除 hit += 1 ;ヒット数(デバッグ用) } ;一番下まで行ったら【実行】 es_get TEKI_TM_Di_y,80,5 ;弾Y repeat 5 if TEKI_TM_Di_y >= 480 { GURE_HIT_f(cnt) = 0 ;グレイズヒットフラグ【初期化】 } loop return ;*************グレイズ**************** *グレイズ TKTM_no = 80 ;敵弾の場所検索ID GURE_no = 410 ;グレイズの場所検索ID repeat 5 if GURE_HIT_f(cnt) = 0 { ;グレイズヒットフラグ es_get GURE_x(cnt),TKTM_no,3 ;スプライトのX座標 es_get GURE_y(cnt),TKTM_no,5 ;スプライトのY座標 es_set GURE_no, GURE_x(cnt)-21,GURE_y(cnt)-51, 410 ;(Yの本来の値は-21) es_type GURE_no,128 ;グレイズtype値(64) } TKTM_no++ ;敵弾の場所検索ID GURE_no++ ;グレイズの場所検索ID loop ;当たり判定 ; 400(自機),128(グレイズ) es_check JK_VS_GURE ,400,128 if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;スプライト削除(グレイズ) GURE_hit++ ;ヒット数(デバッグ用) ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズの場所検索ID repeat 5 if JK_VS_GURE = GURE_no : GURE_HIT_f(cnt) = 1 GURE_no++ ;グレイズの場所検索ID loop } return



アイドル

リンク

2019/6/16(Sun) 08:59:39|NO.87619

どうも。アイドルです。

縦に配置すると複数回グレイズにぶつかる問題ですが解決しました。
解決事態は何日前からしてたんですが、ソースに色々不備がありそうだったので、
色々調査をしてたら時間がかかってしまいました・・・

今度こそ解決です。何かあったら新しく質問するかもです。


 ■変更、追加点■
・敵弾フラグを配置(90、91行)
・「es_get TEKI_TM_Di_y,80,5」が80番のスプライトしか調べられてなかったので、
「TKTM_no = 80」をおいて、増加するようにして、スプライトを80〜84を取得できるように修正

・一番下まで行った時、敵弾フラグを初期化
・今回の事象とは関係ない敵弾とのあたり判定を削除


#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 500,500,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 = 220 : JIKI_y = 313 ;自機の座標 ;---低速--- es_size 9,9, 50 es_pat 195, 46,43 es_type 195,4 ;---敵弾--- es_size 17,17, 50 es_pat 85, 70,0 ;敵弾 TAMA_MAX = 5 dim TEKI_f,TAMA_MAX dim TAMA_x,TAMA_MAX dim TAMA_y,TAMA_MAX ;グレイズ dim GURE_f,TAMA_MAX dim GURE_HIT_f,TAMA_MAX ;▼▼▼▼▼▼▼配列▼▼▼▼▼▼▼ ;縦配置 TAMA_x = 200,200,200,200,200 TAMA_y = 300,250,200,150,100 ;横配置 /* TAMA_x = 50,120,190,260,330 TAMA_y = 300,300,300,300,300 */ ;************メインループ*************** *メイン es_cls ;画面クリア es_draw ;スプライト描画 pos 400,50 : es_mes "hit " + hit pos 400,70 : es_mes "GURE_hit " + GURE_hit pos 400,100 : es_mes "GURE_HIT_f(0) " + GURE_HIT_f(0) pos 400,120 : es_mes "GURE_HIT_f(1) " + GURE_HIT_f(1) pos 400,140 : es_mes "GURE_HIT_f(2) " + GURE_HIT_f(2) pos 400,160 : es_mes "GURE_HIT_f(3) " + GURE_HIT_f(3) pos 400,180 : es_mes "GURE_HIT_f(4) " + GURE_HIT_f(4) pos 400,210 : es_mes "TEKI_TM_f(0) " + TEKI_f(0) pos 400,230 : es_mes "TEKI_TM_f(1) " + TEKI_f(1) pos 400,250 : es_mes "TEKI_TM_f(2) " + TEKI_f(2) pos 400,270 : es_mes "TEKI_TM_f(3) " + TEKI_f(3) pos 400,290 : es_mes "TEKI_TM_f(4) " + TEKI_f(4) ;*************カウンター************** gosub *自機の移動 gosub *敵弾移動 gosub *グレイズ ;自機 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 ;*************低速移動****************** getkey Skey,16 ;シフトキー if Skey{ JIKISpd = 2 ;自機の低速スピード } else { 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 ;**************敵弾移動*************** *敵弾移動 repeat 5 if TEKI_f(cnt) = 0 { ;敵弾ヒットフラグ TEKI_f(cnt) = 1 ;敵弾ヒットフラグ es_exnew TEKI_TM ,80,84 ;新規スプライトNo (80〜84) es_set TEKI_TM, TAMA_x(cnt),TAMA_y(cnt), 85 ;スプライトNo, X,Y座標 ,キャラNo es_apos TEKI_TM, 0,5 ,30 ;↓に移動 es_type TEKI_TM,32 } loop ;一番下まで行ったら【実行】 TKTM_no = 80 ;敵弾の場所検索ID repeat 5 es_get TEKI_TM_Di_y,TKTM_no,5 ;弾Y if TEKI_TM_Di_y >= 480 { TEKI_f(cnt) = 0 ;敵弾フラグ GURE_HIT_f(cnt) = 0 ;グレイズヒットフラグ【初期化】 }TKTM_no++ ;敵弾の場所検索ID loop return ;*************グレイズ**************** *グレイズ TKTM_no = 80 ;敵弾の場所検索ID GURE_no = 410 ;グレイズの場所検索ID repeat 5 if GURE_HIT_f(cnt) = 0 { ;グレイズヒットフラグ es_get GURE_x(cnt),TKTM_no,3 ;スプライトのX座標 es_get GURE_y(cnt),TKTM_no,5 ;スプライトのY座標 es_set GURE_no, GURE_x(cnt)-21,GURE_y(cnt)-51, 410 ;(Yの本来の値は-21) es_type GURE_no,128 ;グレイズtype値(64) } TKTM_no++ ;敵弾の場所検索ID GURE_no++ ;グレイズの場所検索ID loop ;当たり判定 ; 400(自機),128(グレイズ) es_check JK_VS_GURE ,400,128 if JK_VS_GURE != -1 { es_kill JK_VS_GURE ;スプライト削除(グレイズ) GURE_hit++ ;ヒット数(デバッグ用) ;グレイズのスプライトを調べてフラグを立てていく GURE_no = 410 ;グレイズの場所検索ID repeat 5 if JK_VS_GURE = GURE_no : GURE_HIT_f(cnt) = 1 GURE_no++ ;グレイズの場所検索ID loop } return



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