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


HSPTV!掲示板


未解決 解決 停止 削除要請

2019
0517
アイドル「hspdxfix.as」を使った当たり判定が特定の条件で判定しなくなる5解決


アイドル

リンク

2019/5/17(Fri) 22:02:12|NO.87374

どうもお久しぶりです。

ず〜と解決に手こずってた自機オプションの弾を、いい感じに実装できそうだったんですが、
密着した状態で自機オプションの弾を当てると、type値が0になってしまう不具合がおきるようになりました。
なぜこうなるのかわかりませんが、何か見落としていると思うんです・・・

 ■仕様■
・Zキーを押すと、自機オプションから弾を出す
・敵と自機オプション弾がヒットすると、自機オプション弾のスプライトを削除する

 ■不具合■
・敵に密着した状態で、自機オプションを敵にぶつけると、type値が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 ;スプライト有効エリア設定 buffer 4 es_buffer 4,,$00ff00,,1 ;---自機--- JIKI_x = 85 : JIKI_y = 295 ;---オプション--- es_size 15,15, 100 es_pat 55, 0,76 ;---オプション弾--- es_size 17,17, 100 es_pat 60, 56,44 ;------ buffer 5 es_buffer 5,,$00ff00,,1 gsel 0,1 ;---敵---60〜170 es_size 25,10, 50 es_pat 80, 0,0 TEKI_x = 100 : TEKI_y = 300 gsel 0,1 ;オプション OP_MAX = 4 ;オプションの最大数(4) dim JK_OP_x,OP_MAX ;X dim JK_OP_y,OP_MAX ;Y ;オプション弾 dim JK_OP_TM_x,OP_MAX ;X dim JK_OP_TM_y,OP_MAX ;Y ;****************メインループ*********** *メイン es_cls es_draw ;*************************************** gosub *自機の移動 gosub *オプションの処理 gosub *オプション弾の処理 gosub *敵 gosub *デバック用に表示させる es_sync ;画面更新 await 16 goto *メイン ;**************自機の移動*************** *自機の移動 stick key,15 ;キー取得 if key & 1 : JIKI_x = JIKI_x - 2 ;←の移動 if key & 2 : JIKI_y = JIKI_y - 2 ;↑の移動 if key & 4 : JIKI_x = JIKI_x + 2 ;→の移動 if key & 8 : JIKI_y = JIKI_y + 2 ;↓の移動 return ;*********オプションの処理************** *オプションの処理 ;右側 JK_OP_x(0) = JIKI_x+21 JK_OP_y(0) = JIKI_y+11 es_set 50, JK_OP_x(0),JK_OP_y(0), 55 ;スプライトNo, X,Y座標 ,キャラNo ;左側 JK_OP_x(1) = JIKI_x-8 JK_OP_y(1) = JIKI_y+11 es_set 51, JK_OP_x(1),JK_OP_y(1), 55 ;スプライトNo, X,Y座標 ,キャラNo ;後ろ JK_OP_x(2) = JIKI_x+7 JK_OP_y(2) = JIKI_y+50 es_set 52, JK_OP_x(2),JK_OP_y(2), 55 ;スプライトNo, X,Y座標 ,キャラNo return ;***********オプション弾の処理********** *オプション弾の処理 getkey keyZ,90 ;Zキー if keyZ = 1 { ;Zが押されたら「実効」 JK_OP_no = 50 ;オプションの場所検索ID JK_OP_TM_no = 60 ;弾の場所検索ID repeat OP_MAX ;オプションの最大数(4) ;スプライトの最小数、最大数をコントロールする if cnt = 0 : JKTM_SP_s = 60 : JKTM_SP_m = 60 if cnt = 1 : JKTM_SP_s = 61 : JKTM_SP_m = 61 if cnt = 2 : JKTM_SP_s = 62 : JKTM_SP_m = 62 es_get JK_OP_TM_x(cnt),JK_OP_no,3 ;スプライトのX座標 es_get JK_OP_TM_y(cnt),JK_OP_no,5 ;スプライトのY座標 es_exnew JK_OP_TM_no, JKTM_SP_s,JKTM_SP_m ;新規スプライト取得 es_set JK_OP_TM_no, JK_OP_TM_x(cnt),JK_OP_TM_y(cnt),60 ;スプライト設定 es_apos JK_OP_TM_no, 0,-5 ,100 ;↑に移動 es_type JK_OP_TM_no,64 ;オプション弾type値(64) JK_OP_no++ ;オプションの場所検索ID JK_OP_TM_no++ ;弾の場所検索ID loop } return ;*************敵**************** *敵 es_exnew TEKI ,80,190 ;新規スプライトNo es_set TEKI, TEKI_x,TEKI_y, 80 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 es_find JK_TM_Di, 4096, 80,190 ;スプライト検索(type値) es_check JK_TM_VS_TEKI ,JK_TM_Di,64 ;オプション弾type値(64) if JK_TM_VS_TEKI != -1 { es_kill JK_TM_VS_TEKI ;オプション弾「削除」 hit++ ;ヒット数(デバック用) } return ;*****デバック用に表示させる****** *デバック用に表示させる pos 400,230 : es_mes "hit " + hit pos 400,270 : es_mes "(0)" pos 400,290 : es_mes "(1)" pos 400,310 : es_mes "(2)" JK_OP_TM_mes_y = 250 ;座標 JK_OP_TM_no = 60 ;弾の場所検索ID repeat 3 JK_OP_TM_mes_y += 20 ;複数見るためにずらす ;Y値 es_get JK_OP_TM_pos_y,JK_OP_TM_no,5 pos 430,JK_OP_TM_mes_y : es_mes "" + JK_OP_TM_pos_y ;type値 es_get JK_OP_TM_type,JK_OP_TM_no,13 pos 470,JK_OP_TM_mes_y : es_mes "type " + JK_OP_TM_type JK_OP_TM_no++ ;弾の場所検索ID loop return



この記事に返信する


リンク

2019/5/17(Fri) 22:47:40|NO.87375

> ■不具合■
>・敵に密着した状態で、自機オプションを敵にぶつけると、type値が0になる
ここのところがよくわからないのですが、
敵に密着するしないに関わらず、敵に当たった弾は0画面外に出た弾は64のままでした。
敵に当たってkillされた弾はタイプ値含めて完全消去、
当たらず画面外(es_area外)に出た弾はフラグだけ消えて
タイプ値その他は消されない状態だったような気がします、うろおぼえ。



リンク

2019/5/17(Fri) 23:12:46|NO.87377

いや、でもy値は消えていないですね。失礼しました。



アイドル

リンク

2019/5/18(Sat) 10:21:06|NO.87380

撃さん。お返事ありがとうございます。
ちょっと不具合内容が足りていなかったです><

■不具合■
・敵に密着した状態で、自機オプション弾を敵にぶつけると、(2)に配置している弾が当たらなくなる

この不具合はずっとZキーを押し続けていると発生しますが、
Zキーをちょいちょい押す程度では発生しません。

また、後ろに移動すると、(2)に配置している自機オプション弾が敵に当たるようになります。



原因は、密着して撃つと(0)に配置しているtype値が0になっている結果、
(2)の弾が当たらないようになっているような気がします。

後ろに下がると、(0)のtype値が64⇔0となり、(2)もtype値が64⇔0となるので、
このあたりが原因なんじゃないかと思っています。



リンク

2019/5/18(Sat) 12:00:14|NO.87381

何となくわかりました。

  es_check JK_TM_VS_TEKI ,JK_TM_Di,64 ;オプション弾type値(64)   if JK_TM_VS_TEKI != -1 {   es_kill JK_TM_VS_TEKI ;オプション弾「削除」   hit++ ;ヒット数(デバック用)   }
の部分で、「敵と当たっているタイプ64のスプライトがあればそのスプライトを消す
処理を”1回だけ”処理します。
仮に同時に2発の弾が当たっていても1個は消すがもう1つが当たっているか調べません。
敵の当たり判定が小さい事もあり次のフレームでもう衝突していない所まで弾が進んでしまう。
とりあえず、応急で直すなら判定処理を3回くらいリピートしたり
敵の当たり判定をもう少し大きくするなどで対応出来ますが、
今後敵や弾の数が増える見通しならば設計段階からの見直しが必要かとは思います。



アイドル

リンク

2019/5/18(Sat) 16:16:12|NO.87386

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

うわぁあああやってもうた・・・
繰り返しチェックしないと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 ;スプライト有効エリア設定 buffer 4 picload "jiki.bmp" ;自機 es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 400, 0,0 JIKI_x = 85 : JIKI_y = 300 es_set 400, JIKI_x,JIKI_y, 400 ;---クリスタル--- es_size 15,15, 100 es_pat 55, 0,76 ;---クリスタル弾--- es_size 17,17, 100 es_pat 60, 56,44 ;------ buffer 5 picload "teki.bmp" ;敵 es_buffer 5,,$00ff00,,1 gsel 0,1 ;---敵---60〜170 es_size 18,19, 50 es_pat 80, 0,0 TEKI_x = 100 : TEKI_y = 300 gsel 0,1 ;クリスタル KURI_MAX = 4 ;クリスタルの最大数(4) dim JK_KURIS_f,KURI_MAX ;フラグ dim JK_KURIS_x,KURI_MAX ;X dim JK_KURIS_y,KURI_MAX ;Y ;クリスタル弾 dim JK_KURIS_TM_f,KURI_MAX ;弾フラグ dim JK_KURIS_TM_x,KURI_MAX ;弾X dim JK_KURIS_TM_y,KURI_MAX ;弾Y ;****************メインループ*********** *メイン es_cls es_draw pos 400,20 : es_mes "JK_KURIS_TM_no " + JK_KURIS_TM_no pos 400,40 : es_mes "JK_KURIS_TM_hs " + JK_KURIS_TM_hs pos 400,60 : es_mes "KURI_MAX_H " + KURI_MAX_H pos 400,90 : es_mes "JK_KURIS_TM_f(0) " + JK_KURIS_TM_f(0) pos 400,110 : es_mes "JK_KURIS_TM_f(1) " + JK_KURIS_TM_f(1) pos 400,130 : es_mes "JK_KURIS_TM_f(2) " + JK_KURIS_TM_f(2) pos 400,150 : es_mes "JK_KURIS_TM_f(3) " + JK_KURIS_TM_f(3) pos 400,180 : es_mes "JK_KURIS_x(0) " + JK_KURIS_x(0) pos 400,200 : es_mes "JK_KURIS_y(0) " + JK_KURIS_y(0) pos 400,220 : es_mes "JK_KURIS_x(1) " + JK_KURIS_x(1) pos 400,240 : es_mes "JK_KURIS_y(1) " + JK_KURIS_y(1) pos 400,260 : es_mes "JK_KURIS_x(2) " + JK_KURIS_x(2) pos 400,280 : es_mes "JK_KURIS_y(2) " + JK_KURIS_y(2) pos 400,300 : es_mes "JK_KURIS_x(3) " + JK_KURIS_x(3) pos 400,320 : es_mes "JK_KURIS_y(3) " + JK_KURIS_y(3) pos 400,350 : es_mes "hit " + hit ;*************カウンター**************** gosub *自機の移動 gosub *クリスタルの処理 gosub *クリスタル弾の処理 gosub *敵 gosub *デバッグツール gosub *デバック用に表示させる ;自機 es_pos 400, JIKI_x,JIKI_y es_type 400,8 ;低速移動 TE_x = JIKI_x+10 : TE_y = JIKI_y+16 es_pos 195, TE_x,TE_y es_type 195,4 ;*************低速移動****************** 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 ;*********クリスタルの処理************** *クリスタルの処理 ;---パワーが100以上--- if PW_KZ >= 100 { JK_KURIS_x(0) = JIKI_x+7 JK_KURIS_y(0) = JIKI_y+50 KURI_MAX_H = 1 ;クリスタル弾のループ回数を変更する } ;---パワーが200以上--- if PW_KZ >= 200 { ;右側 JK_KURIS_x(0) = JIKI_x+37 JK_KURIS_y(0) = JIKI_y+11 ;左側 JK_KURIS_x(1) = JIKI_x-28 JK_KURIS_y(1) = JIKI_y+11 if Skey = 1 { ;シフトキーが押されたら「実効」 JK_KURIS_x(0) = JIKI_x+21;右側 JK_KURIS_x(1) = JIKI_x-8;左側 } KURI_MAX_H = 2 ;クリスタル弾のループ回数を変更する } es_set 50, JK_KURIS_x(0),JK_KURIS_y(0), 55 ;スプライトNo, X,Y座標 ,キャラNo es_set 51, JK_KURIS_x(1),JK_KURIS_y(1), 55 ;スプライトNo, X,Y座標 ,キャラNo ;---パワーが300以上--- if PW_KZ >= 300 { JK_KURIS_x(2) = JIKI_x+7 JK_KURIS_y(2) = JIKI_y+50 KURI_MAX_H = 3 ;クリスタル弾のループ回数を変更する } es_set 52, JK_KURIS_x(2),JK_KURIS_y(2), 55 ;スプライトNo, X,Y座標 ,キャラNo ;---パワーが400以上--- if PW_KZ >= 400 { ;右側 JK_KURIS_x(2) = JIKI_x-59 JK_KURIS_y(2) = JIKI_y+16 ;左側 JK_KURIS_x(3) = JIKI_x+72 JK_KURIS_y(3) = JIKI_y+16 if Skey = 1 { ;シフトキーが押されたら「実効」 ;右側 JK_KURIS_x(2) = JIKI_x+17 JK_KURIS_y(2) = JIKI_y+21 ;左側 JK_KURIS_x(3) = JIKI_x-3 JK_KURIS_y(3) = JIKI_y+21 } KURI_MAX_H = 4 ;クリスタル弾のループ回数を変更する } es_set 52, JK_KURIS_x(2),JK_KURIS_y(2), 55 ;スプライトNo, X,Y座標 ,キャラNo es_set 53, JK_KURIS_x(3),JK_KURIS_y(3), 55 ;スプライトNo, X,Y座標 ,キャラNo return ;***********クリスタル弾の処理********** *クリスタル弾の処理 getkey keyZ,90 ;Zキー if keyZ = 1 { ;ショットが押されたら「実効」 JK_KURIS_TM_no = 50;クリスタルの場所検索ID (スプライトNo.) JK_KURIS_TM_hs = 60 ;弾の場所検索ID repeat KURI_MAX ;クリスタルの最大数(4) if cnt = 0 : JKTM_SP_s = 60 : JKTM_SP_m = 60 if cnt = 1 : JKTM_SP_s = 61 : JKTM_SP_m = 61 if cnt = 2 : JKTM_SP_s = 62 : JKTM_SP_m = 62 if cnt = 3 : JKTM_SP_s = 63 : JKTM_SP_m = 63 es_get JK_KURIS_TM_x(cnt),JK_KURIS_TM_no,3 ;スプライトのX座標 es_get JK_KURIS_TM_y(cnt),JK_KURIS_TM_no,5 ;スプライトのY座標 es_exnew JK_KURIS_TM_hs, JKTM_SP_s,JKTM_SP_m ;新規スプライト取得 es_set JK_KURIS_TM_hs, JK_KURIS_TM_x(cnt),JK_KURIS_TM_y(cnt),60 ;スプライト設定 es_apos JK_KURIS_TM_hs, 0,-5 ,100 ;↑に移動 es_type JK_KURIS_TM_hs,64;クリスタル弾type値(64) JK_KURIS_TM_no++;クリスタルの場所検索ID JK_KURIS_TM_hs++;弾の場所検索ID loop } return ;*************敵**************** *敵 es_exnew TEKI ,80,190 ;新規スプライトNo (敵:80〜190) es_set TEKI, TEKI_x,TEKI_y, 80 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 repeat KURI_MAX ;クリスタルの最大数(4) es_find JK_KU_TM_Di, 4096, 80,190 ;スプライト検索(type値) es_check KURIS_TM_VS_TEKI ,JK_KU_TM_Di,64 ;クリスタル弾type値(64) if KURIS_TM_VS_TEKI != -1 { es_kill KURIS_TM_VS_TEKI;クリスタル弾「削除」 hit++ } loop return ;*************デバッグツール************ *デバッグツール getkey key_P,13 ;エンターキー if key_P { ;キーが押されたら実効 if K_P = 0 { PW_KZ += 100 ;自機パワー K_P = 1 } } else { K_P = 0 } return ;*****デバック用に表示させる****** *デバック用に表示させる pos 400,370 : es_mes "(0)" pos 400,390 : es_mes "(1)" pos 400,410 : es_mes "(2)" pos 400,430 : es_mes "(3)" JK_KURIS_TM_mes_y = 350 ;デバック用に表示させる座標 JK_KURIS_TM_hs = 60 ;弾の場所検索ID repeat KURI_MAX_H ;クリスタルの最大数(1〜4) JK_KURIS_TM_mes_y += 20 ;複数見るためにずらす es_get JK_KURIS_TM_pos_y,JK_KURIS_TM_hs,5 ;Y pos 430,JK_KURIS_TM_mes_y : es_mes "" + JK_KURIS_TM_pos_y ;Y es_get JK_KURIS_TM_type,JK_KURIS_TM_hs,13 ;type値 pos 470,JK_KURIS_TM_mes_y : es_mes "type " + JK_KURIS_TM_type ;type値 JK_KURIS_TM_hs++ ;クリスタルの場所検索ID DB_c++ loop return



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