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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1103
アイドル【hspdxfix.as】敵弾にくっつく物体(グレイズ)の処理を1つにまとめたい12解決


アイドル

リンク

2020/11/3(Tue) 19:32:26|NO.91731

hspdxfix.asプラグインで作ったSTGゲームになります。


物体と一緒についていく物体(以下グレイズ)(東方Projectと同じグレイズ)の質問です。

グレイズ処理はどんな弾だろうと同じ処理のためまとめようと思っています。
っていうのも弾の種類が「敵(2種類)、ボス(10種類ぐらい)」っと肥大化してきてしまい、
グレイズを別々で処理するのが効率悪いと思ったからです。

よくわからないと思うので、ソース実行したほうが早いと思います。
改良案は2つ案があります。


 ▲案1▲(;---新しいの---)
弾の情報を以下のように取ってきてgosubする

es_find SIKAKUI_D, 32, SIKAKUI_no,2020 TAMA_no = SIKAKUI_D ;グレイズ代入 gosub *グレイズ処理
*グレイズ処理に飛んで来たら「es_get」で弾の座標を取ってきて「es_exnew」する。
 →このやり方だと弾が出された座標に置かれるだけで、弾と同じ座標を移動しない

 ▲案2▲(;---以前の---)
SIKAKU_no = 2000 ;弾のスプライト検索開始NO
のところで円形スプライト「3000」でも一緒に調べられるようにする。
「2000と3000」を調べるだけにすればいいのでこっちのほうが簡単かもしれない。
弾の種類が増えても追加するだけ。
 →そのやり方がイマイチ思い浮かばない!!

 ■仕様■
1.グレイズは敵弾と同じ座標
2.同じ座標なので弾と同じ方向に移動する

 ↓「今回は関係ないので処理無し」ですが、グレイズがどういう物なのか記載↓
3.グレイズは自機と接触すると点数が加算
4.グレイズは敵弾が画面内にある限り、1弾につき1回しか発生しない
5.グレイズは敵弾が画面外に行ったら、その画面外に行った弾が発射されれば復活する


ボスの弾スプライトは、ボスごとに離して作成する可能性が高いので、連番で管理するっていうのはなしでお願いします・・

#include "hspogg.as";音のために入れる #include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9000,9000,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,498 ;スプライト有効エリア設定 buffer 2 ; picload "G_sisu-2.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;グレイズ es_size 5,30, 50 ;本来は59,59のサイズ es_pat 5000, 0,632 ;---ボス--- buffer 7 ; picload "yakumo.bmp" es_buffer 7,,$00ff00,,1 ;四角 es_size 9,18, 50 es_pat 2000, 0,0 ;円形 es_size 21,21, 50 es_pat 3000, 37,0 gsel 0,1 SIKAKUAI_MAX = 20 ;四角 EN_MAX = 10 ;円形 ;************メインループ*************** *メイン es_cls es_draw ;*************カウンター**************** pos 500,50 : es_mes " " + SATI ;************************************** gosub *ボス処理 es_sync ;画面更新 await 16 goto *メイン ;***************ボス処理*************** *ボス処理 repeat SIKAKUAI_MAX ;20 TUGI = cnt ;送るために代入する es_exnew SIKAKU,2000,2020 if SIKAKU = -1 : break es_set SIKAKU, 200,TUGI*40-400, 2000 es_apos SIKAKU, 0,1, 200 ;200のスピードで↓に移動する es_type SIKAKU, 32 loop ;円形 repeat EN_MAX ;10 es_exnew EN ,3000,3010 if EN = -1 : break es_set EN, 100,100, 3000 es_apos EN, 0,1, 100 ;200のスピードで↓に移動する es_type EN, 32 loop ;---グレイズ準備--- ;四角 SIKAKUI_no = 2000 repeat SIKAKUAI_MAX ;20 es_find SIKAKUI_D, 32, SIKAKUI_no,2020 TAMA_no = SIKAKUI_D ;グレイズ代入 gosub *グレイズ処理 SIKAKUI_no++ loop ;円形 /* EN_no = 3000 repeat SIKAKUAI_MAX ;10 es_find EN_D, 32, EN_no,3010 TAMA_no = EN_D ;グレイズ代入 gosub *グレイズ処理 EN_no++ loop */ return ;***********グレイズ処理*********** *グレイズ処理 /* ;---新しいの--- es_get GURE_x,TAMA_no,3 ;弾X座標 es_get GURE_y,TAMA_no,5 ;弾Y座標 es_exnew GURE_no, 5000,5500 if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 es_set GURE_no, GURE_x-25,GURE_y-21, 5000 } */ ;---以前の--- SIKAKU_no = 2000 ;弾のスプライト検索開始NO GURE_no = 5000 ;グレイズのスプライト検索開始NO repeat SIKAKUAI_MAX ;30 es_get GURE_x(cnt),SIKAKU_no,3 ;弾X座標 es_get GURE_y(cnt),SIKAKU_no,5 ;弾Y座標 es_get GURE_MV_x(cnt),SIKAKU_no,7 ;1フレームに移動する距離X es_get GURE_MV_y(cnt),SIKAKU_no,9 ;1フレームに移動する距離Y if GURE_x(cnt) = 0 AND GURE_y(cnt) = 0 : continue ;弾の座標が取れないときはループしなおす es_set GURE_no, GURE_x(cnt)-25+GURE_MV_x(cnt), GURE_y(cnt)-21+GURE_MV_y(cnt), 5000 SIKAKU_no++ ;弾のスプライト検索開始NO GURE_no++ ;グレイズのスプライト検索開始NO loop return



この記事に返信する


あらや

リンク

2020/11/8(Sun) 03:01:16|NO.91766

申し訳ないのですが、
ソースを実行してもやりたいことがイマイチわかりません。。。

おそらくソースを実行した時に表示されるスプライトは
全て敵弾なんだと思いますが
実行しても全て四角形なので、円形とはなんなのか……

スプライトをセットする処理(es_set)を1つにまとめたいのか
それとも接触判定をまとめたいのか
セットと接触判定の両方なのか

もう少し詳しくお願いします。



アイドル

リンク

2020/11/8(Sun) 11:40:22|NO.91767

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

やはりわかりずらかったですよね・・
わかりずらいと思うので画像を用意しました。(パスは「hsp」です)
https://ux.getuploader.com/UGI_55/download/57


A弾、B弾っていう種類が違う弾があって、それぞれ別処理で作っています。
その弾にくっついているグレイズの処理も別々で作ってました。

A弾+グレイズ
B弾+グレイズ
ソースにするとこんな感じです。

;A弾(四角) SIKAKU_no = 2000 ;弾のスプライト検索開始NO GURE_no = 5000 ;グレイズのスプライト検索開始NO repeat SIKAKUAI_MAX ;30 es_get GURE_x(cnt),SIKAKU_no,3 ;弾X座標 es_get GURE_y(cnt),SIKAKU_no,5 ;弾Y座標 es_get GURE_MV_x(cnt),SIKAKU_no,7 ;1フレームに移動する距離X es_get GURE_MV_y(cnt),SIKAKU_no,9 ;1フレームに移動する距離Y if GURE_x(cnt) = 0 AND GURE_y(cnt) = 0 : continue ;弾の座標が取れないときはループしなおす es_set GURE_no, GURE_x(cnt)-25+GURE_MV_x(cnt), GURE_y(cnt)-21+GURE_MV_y(cnt), 5000 SIKAKU_no++ ;弾のスプライト検索開始NO GURE_no++ ;グレイズのスプライト検索開始NO loop ;B弾(円形) SIKAKU_no = 3000 ;弾のスプライト検索開始NO GURE_no = 5100 ;グレイズのスプライト検索開始NO repeat SIKAKUAI_MAX ;30 es_get GURE_x(cnt),SIKAKU_no,3 ;弾X座標 es_get GURE_y(cnt),SIKAKU_no,5 ;弾Y座標 es_get GURE_MV_x(cnt),SIKAKU_no,7 ;1フレームに移動する距離X es_get GURE_MV_y(cnt),SIKAKU_no,9 ;1フレームに移動する距離Y if GURE_x(cnt) = 0 AND GURE_y(cnt) = 0 : continue ;弾の座標が取れないときはループしなおす es_set GURE_no, GURE_x(cnt)-25+GURE_MV_x(cnt), GURE_y(cnt)-21+GURE_MV_y(cnt), 5000 SIKAKU_no++ ;弾のスプライト検索開始NO GURE_no++ ;グレイズのスプライト検索開始NO loop
これだと弾の種類が増えるたびに処理を書くはめになるので、グレイズを共通処理にしたいと思っています。

>>スプライトをセットする処理(es_set)を1つにまとめたいのか
まさにこれです。
多分すごく単純な処理でいけそうな気がするんだけど、なにも思い浮かばないのです・・・



あらや

リンク

2020/11/8(Sun) 18:02:08|NO.91768

以前の質問でどなたかが言っていたような気がしますが……
弾は自動移動なのに対して、
グレイズは毎ループ位置を調節というのは効率が悪いので
グレイズも弾をセットした時に同じ速度&向きでセットしてはいかがでしょうか。


// 例 // 敵弾をセットする es_set EN, 100,100, 3000 es_apos EN, 0,1, 100 ;100のスピードで↓に移動する es_type EN, 32 // 全く同じ動きでグレイズもセット グレイズのスプライト番号は常に弾+3000(仮) es_set EN+3000, 100,100, 5000; 座標は弾とグレイズのサイズ差に合わせて調整が必要 es_apos EN+3000, 0,1, 100 ;100のスピードで↓に移動する es_type EN+3000, 32

あくまでも一例ですが、
このようにすればグレイズに接触した場合
グレイズのスプライト番号-3000が弾のスプライト番号になるので
-3000のスプライト番号が自機と接触していないかなど確認が容易になるかと。

あとは弾の種類に番号を付けて配列で管理するなどの手法を使えば
グレイズの管理も楽になるかと思います。

弾の種類番号1ならば、グレイズの種類は円形
弾の種類が2ならば、グレイズは四角形
などなど……

弾の大きさとグレイズの大きさの差などだったり
キャラクタ番号なども配列に入れてしまえば
弾の種類に関係なくおおよそ同じ処理にまとめられるかと思います。



アイドル

リンク

2020/11/10(Tue) 23:23:15|NO.91777

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

あわわわわ。最近やる暇がないせいかどっかで似たようなことがあったら申し訳ない・・・
(最近単純なミスも多いしやばい)


参考にしてやってみてこんな感じになりました。
例えば、下に動くものをAタイプとし、右に動く物をタイプBにしました(「TYPE」変数を追加)
これならば自機狙いはCタイプ、別の弾はDタイプ・・・ectって出来ますね。
これならグレイズの動きによるデバックがそんな発生しないかな。

ちなみにいい忘れてましたがグレイズはユーザーに見えない要素です・・・
とりま色々やってみて改良案などが浮かびそうなので、一旦お返事になります。

#include "hspogg.as";音のために入れる #include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9000,9000,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,498 ;スプライト有効エリア設定 buffer 2 picload "G_sisu_質問用.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;グレイズ es_size 59,59, 50 es_pat 5000, 0,0 ;---ボス--- buffer 7 picload "yakumo_質問用.bmp" es_buffer 7,,$00ff00,,1 ;四角 es_size 13,15, 50 es_pat 2000, 0,0 ;円形 es_size 21,21, 50 es_pat 3000, 14,0 gsel 0,1 SIKAKUAI_MAX = 5 ;四角 EN_MAX = 5 ;円形 ;************メインループ*************** *メイン es_cls es_draw ;*************カウンター**************** pos 500,50 : es_mes " " + SATI ;************************************** gosub *ボス処理 es_sync ;画面更新 await 16 goto *メイン ;***************ボス処理*************** *ボス処理 ;四角(Aパターン) repeat SIKAKUAI_MAX ;5 TUGI = cnt ;送るために代入する es_exnew SIKAKU,2000,2004 if SIKAKU = -1 : break es_set SIKAKU, 100+cnt*60,TUGI*80-100, 2000 es_apos SIKAKU, 0,1, 200 ;200のスピードで↓に移動する es_type SIKAKU, 32 loop ;円形(Bパターン) repeat EN_MAX ;5 es_exnew EN ,3000,3004 if EN = -1 : break es_set EN, 100,100, 3000 es_apos EN, 1,0, 100 ;200のスピードで→に移動する es_type EN, 32 loop ;---グレイズ準備--- ;四角(Aパターン) SIKAKUI_no = 2000 repeat SIKAKUAI_MAX ;5 es_find SIKAKUI_D, 32, SIKAKUI_no,2020 TAMA_no = SIKAKUI_D ;グレイズ代入 TYPE = 1 ;Aタイプ gosub *グレイズ処理 SIKAKUI_no++ loop ;円形(Bパターン) EN_no = 3000 repeat SIKAKUAI_MAX ;5 es_find EN_D, 32, EN_no,3010 TAMA_no = EN_D ;グレイズ代入 TYPE = 2 ;Bタイプ gosub *グレイズ処理 EN_no++ loop return ;***********グレイズ処理*********** *グレイズ処理 ;---修正後---- es_get GURE_x,TAMA_no,3 ;弾X座標 es_get GURE_y,TAMA_no,5 ;弾Y座標 es_exnew GURE_no, 5000,5500 if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 ;Aタイプ(代入か配列で数値を変えてもいいけど、とりあえず可視化優先) if TYPE = 1 : es_set GURE_no, GURE_x-25,GURE_y-21, 5000 if TYPE = 1 : es_apos GURE_no, 0,1, 200 ;Bタイプ if TYPE = 2 : es_set GURE_no, GURE_x-18,GURE_y-21, 5000 if TYPE = 2 : es_apos GURE_no, 1,0, 100 } /* ;---新しいの--- es_get GURE_x,TAMA_no,3 ;弾X座標 es_get GURE_y,TAMA_no,5 ;弾Y座標 es_exnew GURE_no, 5000,5500 if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 es_set GURE_no, GURE_x-25,GURE_y-21, 5000 } */ ;---以前の--- /* SIKAKU_no = 2000 ;弾のスプライト検索開始NO GURE_no = 5000 ;グレイズのスプライト検索開始NO repeat SIKAKUAI_MAX ;5 es_get GURE_x(cnt),SIKAKU_no,3 ;弾X座標 es_get GURE_y(cnt),SIKAKU_no,5 ;弾Y座標 es_get GURE_MV_x(cnt),SIKAKU_no,7 ;1フレームに移動する距離X es_get GURE_MV_y(cnt),SIKAKU_no,9 ;1フレームに移動する距離Y if GURE_x(cnt) = 0 AND GURE_y(cnt) = 0 : continue ;弾の座標が取れないときはループしなおす es_set GURE_no, GURE_x(cnt)-25+GURE_MV_x(cnt), GURE_y(cnt)-21+GURE_MV_y(cnt), 5000 SIKAKU_no++ ;弾のスプライト検索開始NO GURE_no++ ;グレイズのスプライト検索開始NO loop SIKAKU_no = 3000 ;弾のスプライト検索開始NO GURE_no = 5100 ;グレイズのスプライト検索開始NO repeat EN_MAX ;5 es_get GURE_x(cnt),SIKAKU_no,3 ;弾X座標 es_get GURE_y(cnt),SIKAKU_no,5 ;弾Y座標 es_get GURE_MV_x(cnt),SIKAKU_no,7 ;1フレームに移動する距離X es_get GURE_MV_y(cnt),SIKAKU_no,9 ;1フレームに移動する距離Y if GURE_x(cnt) = 0 AND GURE_y(cnt) = 0 : continue ;弾の座標が取れないときはループしなおす es_set GURE_no, GURE_x(cnt)-25+GURE_MV_x(cnt), GURE_y(cnt)-21+GURE_MV_y(cnt), 5000 SIKAKU_no++ ;弾のスプライト検索開始NO GURE_no++ ;グレイズのスプライト検索開始NO loop */ return



あらや

リンク

2020/11/12(Thu) 07:36:37|NO.91787

たぶんわかっているであろう事ですが、念のため指摘させていただきます。

・最初のソースもそうでしたが
 円形(Bパターン)のボス(弾?)が5つあるのに座標を修正していないため
 重なってしまって1つに見えるのは仕様でしょうか?



・横に移動している弾は画面外の処理を自動にしているので
 弾とグレイズの消滅と出現がサイズ違いのせいでズレてしまっていますね。



・同じ条件のif文を複数書くのではなくカッコでまとめた方が少し効率が良くなるかと。
>if TYPE = 1 : es_set GURE_no, GURE_x-25,GURE_y-21, 5000
>if TYPE = 1 : es_apos GURE_no, 0,1, 200

if TYPE = 1 { es_set GURE_no, GURE_x-25,GURE_y-21, 5000 es_apos GURE_no, 0,1, 200 }



・弾のループとグレイズのループを分割していますが
 弾のループの中にグレイズも含めれば単純にループ回数が半分になって効率的かと思います。


以上です。
どれもパッと見て少し疑問に思ったところを列挙しただけなので
修正すると逆に挙動がおかしくなるとか、むしろ効率が悪くなるなどでしたら
無視していただいて構いません。



アイドル

リンク

2020/11/15(Sun) 09:32:19|NO.91800

あやらさん、お返事遅れちゃってすいません。


>>・最初のソースもそうでしたが
修正するのを忘れてました・・・

>>・横に移動している弾は画面外の処理を自動にしているので
ミニソースで余計なものを入れないほうがいいと思ってたので、自動になってます

>>・同じ条件のif文を複数書くのではなくカッコでまとめた方が少し効率が良くなるかと。
返信して数日後に気がついて・・・(´Д`)

>>・弾のループとグレイズのループを分割していますが
>> 弾のループの中にグレイズも含めれば単純にループ回数が半分になって効率的かと思います。
本ソースの事情により、弾のループ内に入れられなかったので、ミニソースでもそうしちゃいました><
よくよく考えたら本ソースももうちょっとどうにかなりますねこれ・・・


;四角(Aパターン) repeat SIKAKUAI_MAX ;5 TUGI = cnt ;送るために代入する es_exnew SIKAKU,2000,2004 if SIKAKU = -1 : break es_set SIKAKU, 100+cnt*60,TUGI*80-100, 2000 es_apos SIKAKU, 0,1, 200 ;200のスピードで↓に移動する es_type SIKAKU, 32 TAMA_no = SIKAKU ;グレイズ代入 TYPE = 1 ;Aタイプ gosub *グレイズ処理 SIKAKUI_no++ loop ;円形(Bパターン) repeat EN_MAX ;5 es_exnew EN ,3000,3004 if EN = -1 : break es_set EN, 100,100+cnt*60, 3000 es_apos EN, 1,0, 100 ;200のスピードで→に移動する es_type EN, 32 TAMA_no = EN ;グレイズ代入 TYPE = 2 ;Bタイプ gosub *グレイズ処理 SIKAKUI_no++ loop


ちょっとタイプ判断で不具合発生しちゃったので、原因調査中です。



アイドル

リンク

2020/11/19(Thu) 23:07:53|NO.91823

_・)チラ

あれから時間があいてしまいました。
色々やってて3つ問題がでちゃいました・・・
なんか見落としていると思います・・


・円形の一番下のグレイズが判定されてない
・3wyeのグレイズ座標が弾座標にならない
・es_exnew GURE_no, 5000,5300 → 5000,5269以下にすると、システムエラー(209行目)が発生する

本当は問題を1つにしたかったけど、なんかどうやってもダメだった・・
何かやらかしている・・ほんの少しでもいいのでアドバイス・・あれば!

#include "hspogg.as";音のために入れる #include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9000,9000,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,530 ;スプライト有効エリア設定 ;自機が動ける範囲 ;--上-- 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 buffer 2 picload "G_sisu_質問用.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;グレイズ es_size 59,59, 50 es_pat 5000, 0,0 ;--------- buffer 4 ; picload "jiki.bmp" ;自機 es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 4000, 0, 0 JIKI_x = 186 : JIKI_y = 300 TE_x = 206+10 : TE_y = 390+16 ;低速位置 JIKISpd = 4 ;自機のスピード(4) ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;--------- buffer 6 ; picload "reimu.bmp" es_buffer 6,,$00ff00,,1 ;---敵--- es_size 27,59, 100 es_pat 1100, 66,61 ;---弾--- buffer 7 picload "yakumo_質問用.bmp" es_buffer 7,,$00ff00,,1 ;3wye es_size 13,15, 50 es_pat 2000, 0,0 ;円形 es_size 21,21, 50 es_pat 1000, 14,0 gsel 0,1 ;最大個数 wye_MAX = 3 ;3wye EN_MAX = 5 ;円形 dim GURE_HIT_f,EN_MAX ;グレイズヒットフラグ ;************メインループ*************** *メイン es_cls es_draw ;*************カウンター**************** pos 450,70 : es_mes "REIMU_3wye_f " + REIMU_3wye_f pos 450,90 : es_mes "REIMU_TM_kz " + REIMU_TM_kz pos 450,120 : es_mes "GURE_HIT " + GURE_HIT ;グレイズのtype値を調べる GURE_mes_x = 400 : GURE_mes_y = 320 ;座標 GURE_no = 5000 ;グレイズのスプライト検索開始ナンバー repeat 8 ;---座標をずらす--- GURE_mes_x += 40 if cnt = 5 : GURE_mes_x = 440 : GURE_mes_y += 20 es_get GURE_pos,GURE_no,13 ;type値 pos GURE_mes_x,GURE_mes_y : es_mes "" + GURE_pos GURE_no++ ;グレイズのスプライト検索開始ナンバー loop ;************************************** ;自機 es_set 4000, JIKI_x,JIKI_y, 4000 ;低速移動 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 *メイン ;**************自機の移動************* *自機の移動 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 ;***************ボス処理*************** *ボス処理 ;ボス位置 es_set 1100, 208,70, 1100 es_type 1100,4096 ;四角(3wye) es_get REIMU_x,1100,3 ;X es_get REIMU_y,1100,5 ;Y es_ang REIMU_x,REIMU_y,JIKI_x+8,JIKI_y+8 ;角度取得 REIMU_ang = stat-25 ;自機の方向 if REIMU_3wye_f = 0 { repeat wye_MAX ;3 es_exnew REIMU_TM,2000,2002 if REIMU_TM = -1 : break es_set REIMU_TM,REIMU_x,REIMU_y,2000 ;スプライト設定 es_adir REIMU_TM,REIMU_ang+cnt*25,300 ;スプライト移動方向設定 es_type REIMU_TM,32 ;---グレイズ情報--- TAMA_no = REIMU_TM ;グレイズ代入 GURE_TYPE = 1 ;グレイズタイプ gosub *グレイズ処理 loop REIMU_3wye_f = 1 ;フラグ } ;---画面外判定--- REIMU_no = 2000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,2002, 1 if REIMU_TM = -1 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { REIMU_TM_kz += 1 ;画面外に行った数を数える if REIMU_TM_kz = 3 { REIMU_3wye_f = 0 ;弾フラグ【初期化】 REIMU_TM_kz = 0 ;画面外に行った数【初期化】 } es_kill REIMU_TM ;弾【削除】 }REIMU_no++ ;弾検索ナンバー loop ;円形 repeat EN_MAX ;5 es_exnew EN ,3000,3004 if EN = -1 : break es_set EN, 100,50+cnt*80, 1000 es_apos EN, 1,0, 200 ;200のスピードで→に移動する es_type EN, 32 ;---グレイズ情報--- TAMA_no = EN ;グレイズ代入 GURE_TYPE = 5 ;グレイズタイプ gosub *グレイズ処理 loop ;---画面外判定--- REIMU_no = 3000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,3004, 1 if REIMU_TM < 0 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { es_kill REIMU_TM ;弾【削除】 GURE_HIT_f(REIMU_TM-3000) = 0 ;グレイズヒットフラグ【リセット】 }REIMU_no++ loop ;---当たり判定--- GURE_no = 5000 ;グレイズのスプライト検索開始ナンバー repeat es_check JK_VS_GURE ,4000,128 if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 GURE_HIT_f(GURE_no-5000) = 1;グレイズヒットフラグ【立てる】 GURE_HIT++ ;グレイズにあたった回数(デバック用) }GURE_no++ ;グレイズのスプライト検索開始ナンバー loop return ;***********グレイズ処理*********** *グレイズ処理 es_get GURE_x,TAMA_no,3 ;弾X es_get GURE_y,TAMA_no,5 ;弾Y es_exnew GURE_no,5000,5270 if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 ;---ボス--- ;四角(3wye) if GURE_TYPE = 1 { es_set GURE_no, GURE_x-23,GURE_y-21, 5000 es_adir GURE_no, REIMU_ang,300 } } ;円形 if GURE_TYPE = 5 { es_set GURE_no, GURE_x-18,GURE_y-18, 5000 es_apos GURE_no, 1,0, 200 ;200のスピードで→に移動する } es_type GURE_no, 128 return



あらや

リンク

2020/11/20(Fri) 04:54:43|NO.91824

いくつかおかしな点がありますが、
メインループの最後の方にある『gosub *グレイズ処理』
これはボス処理内でグレイズ処理も呼び出しているので不要です。

>・円形の一番下のグレイズが判定されてない
判定されていなのではなく、
上記のようにメインループの最後にグレイズ処理を行なっているので、
消した直後に再度セットされているだけです。

>・3wyeのグレイズ座標が弾座標にならない
弾の移動方向をセットする行が↓
『es_adir REIMU_TM,REIMU_ang+cnt*25,300』
グレイズの移動方向をセットする行が↓
『es_adir GURE_no, REIMU_ang,300』
設定している角度が違うので方向がズレます。

>・es_exnew GURE_no, 5000,5300 → 5000,5269以下にすると、システムエラー(209行目)が発生する
これは原因が2つありますが、
最初に指摘させていただいたメインループでグレイズ処理を呼んでいる件と
円形グレイズが『if GURE_no != -1』このifの外にある事が原因で不要なグレイズを大量にセットしてしまい、
画面外判定のタイミングなどの理由で
グレイズの最大数を超過するのがたまたま5269になるのかと思います。
最大数を超過した場合GURE_noが-1になり
スプライト番号が-1で新規のグレイズをセットしようとするために起きるエラーかと。


これらを踏まえた上で修正させていただきました。

#include "hspogg.as";音のために入れる #include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9000,9000,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,530 ;スプライト有効エリア設定 ;自機が動ける範囲 ;--上-- 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 buffer 2 picload "G_sisu_質問用.bmp" ;ゲーム中のシステム画像 es_buffer 2,,$00ff00,,1 ;グレイズ es_size 59,59, 50 es_pat 5000, 0,0 ;--------- buffer 4 ; picload "jiki.bmp" ;自機 es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 4000, 0, 0 JIKI_x = 186 : JIKI_y = 300 TE_x = 206+10 : TE_y = 390+16 ;低速位置 JIKISpd = 4 ;自機のスピード(4) ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;--------- buffer 6 ; picload "reimu.bmp" es_buffer 6,,$00ff00,,1 ;---敵--- es_size 27,59, 100 es_pat 1100, 66,61 ;---弾--- buffer 7 picload "yakumo_質問用.bmp" es_buffer 7,,$00ff00,,1 ;3wye es_size 13,15, 50 es_pat 2000, 0,0 ;円形 es_size 21,21, 50 es_pat 1000, 14,0 gsel 0,1 ;最大個数 wye_MAX = 3 ;3wye EN_MAX = 5 ;円形 dim GURE_HIT_f,EN_MAX ;グレイズヒットフラグ ;************メインループ*************** *メイン es_cls es_draw ;*************カウンター**************** pos 450,70 : es_mes "REIMU_3wye_f " + REIMU_3wye_f pos 450,90 : es_mes "REIMU_TM_kz " + REIMU_TM_kz pos 450,120 : es_mes "GURE_HIT " + GURE_HIT ;グレイズのtype値を調べる GURE_mes_x = 400 : GURE_mes_y = 320 ;座標 GURE_no = 5000 ;グレイズのスプライト検索開始ナンバー repeat 8 ;---座標をずらす--- GURE_mes_x += 40 if cnt = 5 : GURE_mes_x = 440 : GURE_mes_y += 20 es_get GURE_pos,GURE_no,13 ;type値 pos GURE_mes_x,GURE_mes_y : es_mes "" + GURE_pos GURE_no++ ;グレイズのスプライト検索開始ナンバー loop ;************************************** ;自機 es_set 4000, JIKI_x,JIKI_y, 4000 ;低速移動 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 *メイン ;**************自機の移動************* *自機の移動 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 ;***************ボス処理*************** *ボス処理 ;ボス位置 es_set 1100, 208,70, 1100 es_type 1100,4096 ;四角(3wye) es_get REIMU_x,1100,3 ;X es_get REIMU_y,1100,5 ;Y es_ang REIMU_x,REIMU_y,JIKI_x+8,JIKI_y+8 ;角度取得 REIMU_ang = stat-25 ;自機の方向 if REIMU_3wye_f = 0 { repeat wye_MAX ;3 es_exnew REIMU_TM,2000,2002 if REIMU_TM = -1 : break es_set REIMU_TM,REIMU_x,REIMU_y,2000 ;スプライト設定 ;es_adir REIMU_TM,REIMU_ang+cnt*25,300 ;スプライト移動方向設定 REIMU_ang2 = REIMU_ang+cnt*25; 角度を記録 追加 es_adir REIMU_TM,REIMU_ang2,300 ;スプライト移動方向設定 修正 es_type REIMU_TM,32 ;---グレイズ情報--- TAMA_no = REIMU_TM ;グレイズ代入 GURE_TYPE = 1 ;グレイズタイプ gosub *グレイズ処理 loop REIMU_3wye_f = 1 ;フラグ } ;---画面外判定--- REIMU_no = 2000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,2002, 1 if REIMU_TM = -1 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { REIMU_TM_kz += 1 ;画面外に行った数を数える if REIMU_TM_kz = 3 { REIMU_3wye_f = 0 ;弾フラグ【初期化】 REIMU_TM_kz = 0 ;画面外に行った数【初期化】 } es_kill REIMU_TM ;弾【削除】 }REIMU_no++ ;弾検索ナンバー loop ;円形 repeat EN_MAX ;5 es_exnew EN ,3000,3004 if EN = -1 : break ;es_set EN, 100,50+cnt*80, 1000 EN_X = 100: EN_Y = 50+cnt*70;座標を記録 追加 es_set EN, EN_X,EN_Y, 1000; 修正 es_apos EN, 1,0, 200 ;200のスピードで→に移動する es_type EN, 32 ;---グレイズ情報--- TAMA_no = EN ;グレイズ代入 GURE_TYPE = 5 ;グレイズタイプ gosub *グレイズ処理 loop ;---画面外判定--- REIMU_no = 3000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,3004, 1 if REIMU_TM < 0 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { es_kill REIMU_TM ;弾【削除】 GURE_HIT_f(REIMU_TM-3000) = 0 ;グレイズヒットフラグ【リセット】 }REIMU_no++ loop ;---当たり判定--- GURE_no = 5000 ;グレイズのスプライト検索開始ナンバー repeat es_check JK_VS_GURE ,4000,128 if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 GURE_HIT_f(GURE_no-5000) = 1;グレイズヒットフラグ【立てる】 GURE_HIT++ ;グレイズにあたった回数(デバック用) } GURE_no++ ;グレイズのスプライト検索開始ナンバー loop return ;***********グレイズ処理*********** *グレイズ処理 /* es_get GURE_x,TAMA_no,3 ;弾X es_get GURE_y,TAMA_no,5 ;弾Y es_exnew GURE_no,5000,5269 if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 ;---ボス--- ;四角(3wye) if GURE_TYPE = 1 { es_set GURE_no, GURE_x-23,GURE_y-21, 5000 es_adir GURE_no, REIMU_ang,300 } } ;円形 if GURE_TYPE = 5 { es_set GURE_no, GURE_x-18,GURE_y-18, 5000 es_apos GURE_no, 1,0, 200 ;200のスピードで→に移動する } es_type GURE_no, 128*/ es_exnew GURE_no,5000,5269 if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 ;---ボス--- ;四角(3wye) if GURE_TYPE = 1 { // 座標は弾のセットに使った変数をそのまま使用 es_set GURE_no, REIMU_x-23,REIMU_y-21, 5000; 修正 es_adir GURE_no, REIMU_ang2,300; 修正 } ;円形 if GURE_TYPE = 5 { // 座標に関しては同上 es_set GURE_no, EN_X-18,EN_Y-18, 5000; 修正 es_apos GURE_no, 1,0, 200 ;200のスピードで→に移動する } es_type GURE_no, 128 } return
修正箇所は最初に指摘させていただいたメインループのグレイズ処理、
四角と円形の弾をそれぞれセットする箇所、
グレイズ処理の全般。

追加・修正した箇所にはそれぞれコメントで『追加』『修正』と書き加えてあります。

※ザックリと修正させていただいたので、どこかで見落としがあるかもしれません。



アイドル

リンク

2020/11/23(Mon) 22:35:06|NO.91842

あやらさん、たびたびありがとうございます!


>>メインループの最後の方にある『gosub *グレイズ処理』
やらかしたぁああああああああ

>・3wyeのグレイズ座標が弾座標にならない
代入して管理すればよかっただけなんですね。

>・es_exnew GURE_no, 5000,5300 → 5000,5269以下にすると、システムエラー(209行目)が発生する
ifの外になってたぁああああああああ


ほんま細かいミスが多いですね・・・
おかげさまで実装している弾すべt・・・1種類以外うまくいきました。
残る1種類は、前にやった「複数弾を当たり判定で、再発射すると座標がずれる」のやつです。


あの弾は画面内で消す処理が走るので、グレイズも画面内判定でグレイズを削除したいのですが、
これまた何かやらかしているのかうまくいかないです。

■新しい問題
動かないで緑弾が画面外に行くと、3wyeの1、2発目のグレイズが消えてしまいます。
(緑弾が画面外に行ったとき、上2つのグレイズが消えているので、それに反応しているっぽい)
2周目以降では消えませんが、別で組み立てているソースだとめっちゃ消えます・・・

このソースでは円形を使って、画面内に行ったらグレイズ削除処理を追加しました。

;---画面外判定--- REIMU_no = 3000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,3004, 1 if REIMU_TM < 0 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { es_kill REIMU_TM ;弾【削除】 ;○○○追加○○○ es_kill DERI_GURE_no(REIMU_no-3000) ;グレイズ【削除】 }REIMU_no++ loop
~~~~

;円形 if GURE_TYPE = 5 { es_set GURE_no, EN_x-18,EN_y-18, 5000 es_apos GURE_no, 1,0, 200 ;200のスピードで→に移動する } ;○○○追加○○○ DERI_GURE_no(GURE_no-5000) = GURE_no;グレイズスプライト値を記録 es_type GURE_no, 128 }



あらや

リンク

2020/11/26(Thu) 19:49:23|NO.91857

>動かないで緑弾が画面外に行くと、3wyeの1、2発目のグレイズが消えてしまいます。
弾もグレイズも全て『es_exnew』でスプライト№を取得しているために
弾の番号とグレイズの番号がリンクしていないのが原因かと思います。

ソースの流れ通りにそれぞれの番号を書くと
煩雑になってもうしわけありませんが

四角(3wye)の番号1、2000
グレイズの番号1、 5000(配列のインデックス=0)
四角(3wye)の番号2、2001
グレイズの番号2、 5001(配列のインデックス=1)
四角(3wye)の番号3、2002
グレイズの番号3、 5002(配列のインデックス=2)

円形の番号1、   3000
グレイズの番号4  5003(配列のインデックス=3)
円形の番号2、   3001
グレイズの番号5  5004(配列のインデックス=4)
円形の番号3、   3002
グレイズの番号6  5005(配列のインデックス=5)
円形の番号4、   3003
グレイズの番号7  5006(配列のインデックス=6)
円形の番号5、   3004
グレイズの番号8  5007(配列のインデックス=7)

この番号を画面外判定の処理に当てはめると
『es_kill DERI_GURE_no(REIMU_no-3000)』
円形3000を削除するときには、配列インデックス0=5000のグレイズ(四角3wye)を削除



以下同文

理屈の上では円形が外に出たときに、四角のグレイズも全部消えるはずなんですが
2つだけというのは画面外に消えて再度セットされるタイミングなどが絡んだ結果かと。

リンクさせるには全てのスプライトを『es_exnew』で
管理できない状況にするのを辞めるべきかと思います。
例:
四角のスプライトが2000~2002ならば、グレイズは5000~5002に限る
円形のスプライトは3000~30004ならば、グレイズは5010~5014にするなど

数値差は適当ですが、下一桁を合わせた方が管理しやすそうなので
中途半端ですが合わせてみました。


;---画面外判定--- REIMU_no = 3000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,3004, 1 if REIMU_TM < 0 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { es_kill REIMU_TM ;弾【削除】 ;○○○追加○○○ es_kill REIMU_TM+2010 ;グレイズ【削除】 }REIMU_no++ loop ;~~省略~~ ;***********グレイズ処理*********** *グレイズ処理 // es_exnewは辞める ;es_exnew GURE_no,5000,5269 // es_exnewを辞める事でif文が不要になる ;if GURE_no != -1 { ;既にスプラトNoがあると-1が入りエラーになるので回避 ;---ボス--- ;四角(3wye) if GURE_TYPE = 1 { GURE_no = REIMU_TM + 3000; // グレイズのスプライト値を弾と3000差にする // 座標は弾のセットに使った変数をそのまま使用 es_set GURE_no, REIMU_x-23,REIMU_y-21, 5000; 修正 es_adir GURE_no, REIMU_ang2,300; 修正 } ;円形 if GURE_TYPE = 5 { GURE_no = EN + 2010; // グレイズのスプライト値を弾と2010差にする // 座標に関しては同上 es_set GURE_no, EN_X-18,EN_Y-18, 5000; 修正 es_apos GURE_no, 1,0, 200 ;200のスピードで→に移動する } es_type GURE_no, 128 ;} return



アイドル

リンク

2020/11/28(Sat) 21:15:41|NO.91865

あらやさん、たびたびありがとうございます!


>弾もグレイズも全て『es_exnew』でスプライト№を取得しているために
>弾の番号とグレイズの番号がリンクしていないのが原因かと思います。

>理屈の上では円形が外に出たときに、四角のグレイズも全部消えるはずなんですが
>2つだけというのは画面外に消えて再度セットされるタイミングなどが絡んだ結果かと。

>リンクさせるには全てのスプライトを『es_exnew』で
>管理できない状況にするのを辞めるべきかと思います。

なるほど。前にもこんな事があったような・・(´Д`)
es_exnewでの管理をやめて代入でやることにします。
しかしスプライトプラグインほんと難しいですね・・・・

色々改良しちゃったので追加部分以外もソースだします。誰かの参考になるといいなー
今度こそ解決しました!(はず!!)

#include "hspdxfix.as" ;DXライブラリ使用 width ,,130,200 ;ウィンドウの位置 es_ini 9000,9000,360;スプライトの最大数、キャラクタ定義の最大数,周の精度(180*2) es_screen 640,480 ,0,0,1,1 es_window -13,-43, 640,480 ;スプライト表示エリア設定 es_area -36,-430, 600,530 ;スプライト有効エリア設定 ;自機が動ける範囲 ;--上-- 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 ;--------- buffer 2 picload "G_sisu_質問用.bmp" es_buffer 2,,$00ff00,,1 ;グレイズ es_size 59,59, 50 es_pat 5000, 0,0 ;--------- buffer 4 picload "jiki.bmp" es_buffer 4,,$00ff00,,1 ;---自機--- es_size 28,42, 100 es_pat 4000, 0, 0 JIKI_x = 186 : JIKI_y = 300 TE_x = 206+10 : TE_y = 390+16 ;低速位置 JIKISpd = 4 ;自機のスピード(4) ;---低速(自機の中心)--- es_size 9,9, 50 es_pat 70, 46,43 es_type 70,2 ;--------- buffer 6 ; picload "reimu.bmp" es_buffer 6,,$00ff00,,1 ;---敵--- es_size 27,59, 100 es_pat 1100, 66,61 ;■■■当たり判定用■■■ ;下 es_size 112,6, 100 es_pat 1601, 134,598 es_set 1601, 165,300, 1601 ;上 es_size 112,6, 100 es_pat 1602, 134,598 es_set 1602, 165,166, 1602 ;---弾--- buffer 7 picload "yakumo_質問用.bmp" es_buffer 7,,$00ff00,,1 ;3wye es_size 13,15, 50 es_pat 2000, 0,0 ;円形 es_size 21,21, 50 es_pat 1000, 14,0 ;束札 es_size 13,15, 50 es_pat 1500, 0,0 gsel 0,1 ;最大個数 wye_MAX = 3 ;3wye EN_MAX = 5 ;円形 ;束札の数 AK_MAX = 4 ;赤弾の最大数(4) AK_G_MAX = 2 ;グループ数 dim REI_AK_f, AK_MAX,AK_G_MAX ;フラグ dim REI_AK_x, AK_MAX,AK_G_MAX ;X dim REI_AK_y, AK_MAX,AK_G_MAX ;Y ;*************束札の数*************** ;下 REI_AK_x(0,0) = 177,205,230,252 REI_AK_y(0,0) = 227,227,227,227 ;上 REI_AK_x(0,1) = 177,205,230,252 REI_AK_y(0,1) = 230,230,230,230 ;************メインループ*************** *メイン es_cls es_draw ;*************カウンター**************** pos 450,70 : es_mes "REIMU_3wye_f " + REIMU_3wye_f pos 450,90 : es_mes "REIMU_TM_kz " + REIMU_TM_kz pos 450,120 : es_mes "GURE_HIT " + GURE_HIT ;グレイズのtype値を調べる GURE_mes_x = 400 : GURE_mes_y = 320 ;座標 GURE_no = 5000 ;グレイズのスプライト検索開始ナンバー repeat 8 ;---座標をずらす--- GURE_mes_x += 40 if cnt = 5 : GURE_mes_x = 440 : GURE_mes_y += 20 es_get GURE_pos,GURE_no,13 ;type値 pos GURE_mes_x,GURE_mes_y : es_mes "" + GURE_pos GURE_no++ ;グレイズのスプライト検索開始ナンバー loop pos 450,150 : es_mes "REI_AK_f(0,0) " + REI_AK_f(0,0) pos 450,170 : es_mes "REI_AK_f(0,1) " + REI_AK_f(0,1) ;************************************** ;自機 es_set 4000, JIKI_x,JIKI_y, 4000 ;低速移動 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 *メイン ;**************自機の移動************* *自機の移動 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 ;***************ボス処理*************** *ボス処理 ;ボス位置 es_set 1100, 208,70, 1100 es_type 1100,4096 ;四角(3wye) es_get REIMU_x,1100,3 ;X es_get REIMU_y,1100,5 ;Y es_ang REIMU_x,REIMU_y,JIKI_x+8,JIKI_y+8 ;角度取得 REIMU_ang = stat-25 ;自機の方向 if REIMU_3wye_f = 0 { repeat wye_MAX ;3 es_exnew REIMU_TM,2000,2002 if REIMU_TM = -1 : break es_set REIMU_TM,REIMU_x,REIMU_y,2000 ;スプライト設定 REIMU_ang2 = REIMU_ang+cnt*25 ;角度を記録 es_adir REIMU_TM,REIMU_ang2,300 ;スプライト移動方向設定 es_type REIMU_TM,32 ;---グレイズ情報--- GURE_TYPE = 1 ;グレイズタイプ gosub *グレイズ処理 loop REIMU_3wye_f = 1 ;フラグ } ;---画面外判定--- REIMU_no = 2000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,2002, 1 if REIMU_TM = -1 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { REIMU_TM_kz += 1 ;画面外に行った数を数える if REIMU_TM_kz = 3 { REIMU_3wye_f = 0 ;弾フラグ【初期化】 REIMU_TM_kz = 0 ;画面外に行った数【初期化】 } es_kill REIMU_TM ;弾【削除】 es_kill GURE_no+3000 ;グレイズ【削除】 }REIMU_no++ ;弾検索ナンバー loop ;円形 repeat EN_MAX ;5 es_exnew EN ,3000,3004 if EN = -1 : break EN_X = 100 : EN_Y = 50+cnt*80;座標を記録 es_set EN, EN_x,EN_y, 1000 es_apos EN, 1,0, 200 ;200のスピードで→に移動する es_type EN, 32 ;---グレイズ情報--- GURE_TYPE = 5 ;グレイズタイプ gosub *グレイズ処理 loop ;---画面外判定--- REIMU_no = 3000 ;弾検索ナンバー repeat es_find REIMU_TM, 32, REIMU_no,3004, 1 if REIMU_TM < 0 : break es_get REIMU_TM_x,REIMU_TM,3 ;弾X es_get REIMU_TM_y,REIMU_TM,5 ;弾Y if (REIMU_TM_x < 30-59) or (REIMU_TM_y < 10-59) or (REIMU_TM_x > 412+59) or (REIMU_TM_y > 460+59) { es_kill REIMU_TM ;弾【削除】 es_kill REIMU_TM+2100 ;グレイズ【削除】 }REIMU_no++ loop ;---当たり判定--- GURE_no = 5000 ;グレイズのスプライト検索開始ナンバー repeat es_check JK_VS_GURE ,4000,128 if JK_VS_GURE = -1 : break ;接触しているグレイズが無ければループ終了 if JK_VS_GURE = GURE_no { es_kill JK_VS_GURE ;グレイズ【削除】 GURE_HIT++ ;グレイズにあたった回数(デバック用) }GURE_no++ ;グレイズのスプライト検索開始ナンバー loop return ;**********束札************* *束札 repeat AK_G_MAX ;グループ数(2) TEK_G = cnt repeat AK_MAX ;弾の最大数(4) if REI_AK_f(cnt,TEK_G) = 0 { ;束札のフラグ REI_AK_f(cnt,TEK_G) = 1 ;束札のフラグ es_exnew RI_SP_D, 1500,1507 REI_AK_xx = REI_AK_x(cnt,TEK_G) : REI_AK_yy = REI_AK_y(cnt,TEK_G) ;座標記録 es_set RI_SP_D, REI_AK_xx,REI_AK_yy, 1500 es_type RI_SP_D,64 es_apos RI_SP_D, 0,1 ;↓に移動 if TEK_G >= 1 : es_apos RI_SP_D, 0,-1 ;↑に移動 ;---グレイズ情報--- GURE_TYPE = 6 ;グレイズ↓タイプ if TEK_G >= 1 : GURE_TYPE = 7 ;グレイズ↑タイプ gosub *グレイズ処理 } loop loop ;---削除判定--- RI_SP_no = 1601 ;結界プライト検索開始ナンバー repeat 12 TEK_G = cnt repeat ;結界に接触する可能性のある赤札を全て確認する es_check RI_SP_VS_KEKKAI ,RI_SP_no,64 if RI_SP_VS_KEKKAI != -1 { es_kill RI_SP_VS_KEKKAI ;束札【削除】 es_kill RI_SP_VS_KEKKAI + 4000 ;グレイズ【削除】 REI_AK_f(cnt,TEK_G) = 0 ;束札のフラグ } else { break ;接触している束札が無ければループを抜ける } loop RI_SP_no++;結界プライト検索開始ナンバー loop return ;***********グレイズ処理*********** *グレイズ処理 ;四角(3wye) if GURE_TYPE = 1 { GURE_no = REIMU_TM + 3000;2000+3000 = 5000 es_set GURE_no, REIMU_x-23,REIMU_y-21, 5000 es_adir GURE_no, REIMU_ang2,300 } ;円形 if GURE_TYPE = 5 { GURE_no = EN + 2100 ;3000+2100 = 5100 es_set GURE_no, EN_x-18,EN_y-18, 5000 es_apos GURE_no, 1,0, 200 ;200のスピードで→に移動する } ;束札 if GURE_TYPE = 6 { GURE_no = RI_SP_D + 3700;1500+3700 = 5200 es_set GURE_no, REI_AK_xx-18,REI_AK_yy-18, 5000 es_apos GURE_no, 0,1 ;100のスピードで↓に移動する } if GURE_TYPE = 7 { GURE_no = RI_SP_D + 3700;1500+3700 = 5200 es_set GURE_no, REI_AK_xx-18,REI_AK_yy-18, 5000 es_apos GURE_no, 0,-1 ;100のスピードで↑に移動する } es_type GURE_no, 128 return



アイドル

リンク

2020/11/30(Mon) 19:41:21|NO.91870

解決にチェック入れるの忘れてました

後、下のコメントでは「= 5200」と書いてますが、
「GURE_TYPE = 7」では、「5004」からスタートしていることはわかっています。

;束札 if GURE_TYPE = 6 { GURE_no = RI_SP_D + 3700;1500+3700 = 5200 es_set GURE_no, REI_AK_xx-18,REI_AK_yy-18, 5000 es_apos GURE_no, 0,1 ;100のスピードで↓に移動する } if GURE_TYPE = 7 { GURE_no = RI_SP_D + 3700;1500+3700 = 5200←誤り ;1504+3700 = 5204←正しい es_set GURE_no, REI_AK_xx-18,REI_AK_yy-18, 5000 es_apos GURE_no, 0,-1 ;100のスピードで↑に移動する }



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