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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0804
アイドル【hspdxfix.as】画面左上に敵弾にくっついている物体(グレイズ)が判定されてしまう2解決


アイドル

リンク

2020/8/4(Tue) 17:36:11|NO.91123

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


物体と一緒についていく物体(以下グレイズ)(東方Projectと同じグレイズ)の質問です。
特定のタイミングで敵が出現して、弾を打つ処理を行うと、
後で出現する敵弾(2グループ目)が左上に配置されてしまうため、グレイズが左上に出現してしまいます。

グレイズが左上に出現してしまうと、左上に移動すると点数として稼げてしまうため、
左上のグレイズを出現させたくないです。


原因は座標が0、0であるためそこに表示されていることはわかっているんですが、
判定させない方法がうまく思い浮かばなかったです。
アドバイスなどがございましたらお願いします><

そもろも敵の配置の仕方がよくない等でもいいです・・・
初心者の超久し振りなので解読までに時間かかります。

 ■仕様■
1.一番目でっかい四角:グレイズ
2.中ぐらいの四角:敵弾
3.一番小さい四角:敵
3.グレイズは敵弾にくっついていく
4.グレイズは自機と接触すると点数が加算
3.グレイズは敵弾が画面内にある限り、1弾につき1回しか発生しない

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 800,480,360 ;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 ;スクリーン es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-100, 600,498 ;スプライト有効エリア設定 ;自機が動ける範囲 ;--上-- es_size 383,3 es_pat 10, 0,0 es_set 10, 30,11, 10 ;--左-- es_size 3,450 es_pat 11, 0,0 es_set 11, 30,11, 11 ;--下-- es_size 383,3, 100 es_pat 12, 0,0 es_set 12, 30,460, 12 ;--右-- es_size 3,450 es_pat 13, 0,0 es_set 13, 411,11, 13 ;---敵弾グレイズ--- es_size 59,59, 50 es_pat 600, 0,632 ;--自機---- es_size 28,42, 100 es_pat 350, 0, 0 JIKI_x = 200 : JIKI_y = 300 TE_x = 206+10 : TE_y = 390+16 ;低速位置 ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;---敵--- es_size 10,10, 100 es_pat 320, 19,0 ;---敵弾--- es_size 20,20, 25 es_pat 75, 125,0 ;敵配置 TEKI_MAX = 3 ;敵の最大数 dim TEKI_f,TEKI_MAX ;フラグ ;弾敵弾 dim TEKI_TM_f,TEKI_MAX ;フラグ ;▼▼▼▼▼▼▼敵配列▼▼▼▼▼▼▼ TEKI_x = 4,390,-20 TEKI_y = 160,160,15 ;*********メインループ********* *メイン es_cls ;画面クリア es_draw ;スプライト描画 ;************カウンター****************** pos 480,260 : es_mes "敵出現時間 " + TK_TAIM ;*****************ゲーム枠外*************** ;自機 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 ;************gosub************ gosub *敵 gosub *敵弾移動 gosub *敵弾グレイズ es_sync ;画面更新 await 16 goto *メイン ;*************敵**************** *敵 if TK_TAIM < 200 : TK_TAIM += 1 ;最後の敵が出る時間をカウントする(200) if TK_TAIM >= 100 { ;時間がたったら「実行」 if TK_f = 0 { ;敵実行フラグ repeat TEKI_MAX ;妖精の最大数(3) es_exnew TEKI, 320,324 ;新規スプライトNo es_set TEKI, TEKI_x(cnt),TEKI_y(cnt), 320 ;スプライトNo, X,Y座標 ,キャラNo es_type TEKI,4096 TEKI_Move(TEKI) = cnt ;敵移動フラグ loop } TK_f = 1 ;敵実行フラグ } ;敵の行動処理 TEKI_no = 320 ;敵の検索開始ナンバ− repeat TEKI_MAX ;敵の最大数(3) es_find TEKI_D, 4096,TEKI_no,324 es_get TEKI_pos_y,TEKI_no,5 ;敵Y ;左上 if TK_TAIM >= 100 { ;時間がたったら「実行」 TEKI_hi = 0 ;敵配列 if TEKI_f(TEKI_hi) = 0 { if TEKI_Move(TEKI_no) = 0 { es_apos TEKI_D, 1,1, 100 ;100のスピードで→に移動する if TEKI_pos_y >= 200 { ;特定の位置に移動したら停止する es_apos TEKI_D, 0,0, 0 ;新しく宣言することによって、移動させないようにする } } }TEKI_hi++ ;敵配列増加 ;右上 if TEKI_f(TEKI_hi) = 0 { if TEKI_Move(TEKI_no) = 1 { es_apos TEKI_D, -1,1, 100 ;100のスピードで←に移動する if TEKI_pos_y >= 200 { ;特定の位置に移動したら停止する es_apos TEKI_D, 0,0, 0 ;新しく宣言することによって、移動させないようにする } } } } ;--2グループ目--- ;左上 if TK_TAIM >= 200 { ;時間がたったら「実行」 TEKI_hi = 2 ;敵配列 if TEKI_f(TEKI_hi) = 0 { if TEKI_Move(TEKI_no) = 2 { es_apos TEKI_no, 1,1, 100 ;100のスピードで→に移動する if TEKI_pos_y >= 150 { ;特定の位置に移動したら停止する es_apos TEKI_D, 0,0, 0 ;新しく宣言することによって、移動させないようにする } } } }TEKI_no++ ;敵の検索開始ナンバ− loop return ;*************敵弾移動**************** *敵弾移動 TEKI_no = 320 ;敵の検索開始ナンバ− repeat es_find TEKI, 4096, TEKI_no,324, 1 ;type値, 開始するスプライト,終了するスプライト, 増分 es_get TEKI_TM_x,TEKI,3 ;敵X es_get TEKI_TM_y,TEKI,5 ;敵Y if TEKI < 0 : break ;画面内30,412 敵の大きさ50,38 if (TEKI_TM_x > 30) AND (TEKI_TM_y > 10+8) AND (TEKI_TM_x < 412-50) AND (TEKI_TM_y < 460-38) { if TEKI_TM_f(cnt) = 0 { ;敵弾フラグ es_exnew TEKI_TM, 340,350 ;新規スプライト取得 TEKI_TM_f(TEKI_TM-340) = 1 ;敵弾フラグ es_ang TEKI_TM_x,TEKI_TM_y,TE_x-12,TE_y-12;角度取得 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 return ;*************敵弾グレイズ**************** *敵弾グレイズ ; if TK_TAIM <= 99 : es_set 782, -30,-30,600 ;敵出現までグレイズの位置を画面外にする ;↑この方法で発生させないようにしとうと思ったが、1グループが配置されたら結局左上にグレイズが発生してしまう if TK_TAIM >= 100 { ;敵の1グループ目が出現したら実行 TKTM_no = 340 ;敵弾の検索開始ナンバ− GURE_no = 780 ;敵弾グレイズの検索開始ナンバ− repeat TEKI_MAX ;敵の最大数(3) es_get GURE_x(cnt),TKTM_no,3 ;敵弾グレイズX es_get GURE_y(cnt),TKTM_no,5 ;敵弾グレイズY es_get GURE_MV_x(cnt),TKTM_no,7 ;敵弾が1フレームに移動する距離X es_get GURE_MV_y(cnt),TKTM_no,9 ;敵弾が1フレームに移動する距離Y ;敵弾34 - グレイズ59 = 25の半分は12.5だが12で設定 ↓見やすくするため「-」ではなく「+」にします es_set GURE_no, GURE_x(cnt)-12+GURE_MV_x(cnt),GURE_y(cnt)+12+GURE_MV_y(cnt), 600 es_type GURE_no,128 TKTM_no++ ;敵弾の検索開始ナンバ− GURE_no++ ;敵弾グレイズの検索開始ナンバ− loop } return



この記事に返信する


あらや

リンク

2020/8/6(Thu) 16:29:04|NO.91135

最後の方だけ指摘させていただきます。

es_getで未使用のスプライト發鮖慊蠅靴疹豺
エラーにはならず取得した情報に0が返ってくるようです。

つまり敵弾がまだ無くても163行目あたりの
>repeat TEKI_MAX ;敵の最大数(3)
このループを実行してしまうために
ループ内のes_get全て0を取得し
そのあとにes_setでグレイズを新しいスプライトとして
設定してしまうのが原因と考えられます。

解決策は色々とありますが、
簡単にes_getで取得した値が全て0だった場合は
そのループをスキップするという形にしてはいかがでしょうか?


;*************敵弾グレイズ**************** *敵弾グレイズ ; if TK_TAIM <= 99 : es_set 782, -30,-30,600 ;敵出現までグレイズの位置を画面外にする ;↑この方法で発生させないようにしとうと思ったが、1グループが配置されたら結局左上にグレイズが発生してしまう if TK_TAIM >= 100 { ;敵の1グループ目が出現したら実行 TKTM_no = 340 ;敵弾の検索開始ナンバ− GURE_no = 780 ;敵弾グレイズの検索開始ナンバ− repeat TEKI_MAX ;敵の最大数(3) es_get GURE_x(cnt),TKTM_no,3 ;敵弾グレイズX es_get GURE_y(cnt),TKTM_no,5 ;敵弾グレイズY es_get GURE_MV_x(cnt),TKTM_no,7 ;敵弾が1フレームに移動する距離X es_get GURE_MV_y(cnt),TKTM_no,9 ;敵弾が1フレームに移動する距離Y // 全部0のときはループをスキップする if( GURE_x(cnt) == 0 ) && ( GURE_y(cnt) == 0 ) && ( GURE_MV_x(cnt) == 0 ) && ( GURE_MV_y(cnt) == 0 ) : continue; ;敵弾34 - グレイズ59 = 25の半分は12.5だが12で設定 ↓見やすくするため「-」ではなく「+」にします es_set GURE_no, GURE_x(cnt)-12+GURE_MV_x(cnt),GURE_y(cnt)+12+GURE_MV_y(cnt), 600 es_type GURE_no,128 TKTM_no++ ;敵弾の検索開始ナンバ− GURE_no++ ;敵弾グレイズの検索開始ナンバ− loop } return



アイドル

リンク

2020/8/6(Thu) 17:32:53|NO.91136

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

つい先程自己解決しました!!
考え方は同じで、「es_get」する物体がないせいで「0」に設定されてしまうのが原因なので、
es_getした座標が0ならば「00する」っていう解決方法を思いつきました。


私は「if GURE_x(cnt) = 0 : GURE_x(cnt) = -20」っていうふうにして、
とりま画面外におくことにしましたが、ループやりなおしが良さそうですね!
この方法なら私でも理解ができるので助かります!!



記事削除

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

NO.91123への返信

マスコット

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

名前

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

削除用パスワード

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

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

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